Linq to SQL,C#.
我有三层: DAL,BL,应用程序。我希望在BL中为每个表构建搜索函数,这样这些函数就可以从应用层获得参数“where”表达式。这种方法的优点是每个表都有一个函数,这样客户端就可以以一种自由和动态的方式搜索,给他5种方式(例如);限制他的搜索。
为此,我需要为我的应用程序层提供我的DAL层的DLL。这样做并不是解决问题的好方法(让用户动态地构建自己的搜索,用构建的搜索函数来限制他)。如果应用程序层对我的DAL层有一个动态链接库,则应用程序层可以声明一个ContextObject并为我的数据库做坏事。
我能做些什么来解决这个问题呢?
谢谢你,斯塔夫·阿尔菲。
更新1:
如您所知,为每个表构建一个类。我不想将DAL DLL公开到应用程序层,所以我不能将Linq用于应用程序层中的Sql类。我发现的解决方案是构建与Linq与Sql类相同的类,以便Application层可以使用它们。BL层是用于凸化这些类的resposnibol。由于应用程序层不对Sql的类使用Linq,所以我不能给应用层一个IQueryable ( BL层的任何函数的任何结果都转换为应用层的类)。
更新2:
Linq有LinqClientDB.designer.cs,并构建这些类。
[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="ClientDB")]
public partial class LinqClientDBDataContext : System.Data.Linq.DataContext
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Clients")]
public partial class Client : INotifyPropertyChanging, INotifyPropertyChanged如果我向应用程序层公开DAL层,则应用程序层可以访问LinqClientDBDataContext类。这不是一个好办法。因此,在BL层中,我将DAL.Client类转换为BL.Client类,但是不能对客户端的表进行动态搜索。我能做什么?
发布于 2013-03-30 18:08:31
通过BL公开IQueryable<T>并不会暴露DAL。由于您希望将数据库实体封装在应用程序层的单独类中,所以仍然可以这样做,尽管应用程序将在它可以运行的查询类型中受到更大的限制。
// DAL
public class Entity { ... }
// BL
public class EntityInfo : Entity { ... }
...
public IQueryable<EntityInfo> GetEntities()
{
return from e in dbContext.Entities
select new EntityInfo
{
// populate your application layer object
}
}下面是提供相同结果的另一种编码方法
public Expression<Func<Entity, EntityInfo>> materializeEntityInfo =
e => new EntityInfo { .. };
public IQueryable<EntityInfo> GetEntities()
{
return dbContext.Entities.Select(materializeEntityInfo);
}https://stackoverflow.com/questions/15721627
复制相似问题