C#,LINQ到SQL
有人建议我打开新的话题,因为我的问题没有解决方案。现在我需要你的帮助来重新设计我的图层。Linq To Sql-在不将DAL层暴露为DLL 的情况下动态搜索应用程序层
我的项目包括三个层次:DAL,BL,应用程序。Linq2Sql存在于DAL层中,他自动为数据库中的每个表生成一个类,并生成一个ContextObject来管理数据库。我不能更改这个类中的任何内容,因为DB中的任何更改都将导致这些类的重新自动生成。
[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
这些类别暴露于BL层。应用程序层不需要向LinqClientDBDataContext(ContextObject(公开,因此我不能向任何自动生成的Linq2Sql代码(在本例中为客户端类(公开应用程序层。这就是为什么我制作了一个由DAL在BL层生成的客户端的"重复"类。客户端对象:
private BusinessLogic.Client Convert(ClientDataAccessLayer.Client Client)
{
return new BusinessLogic.Client(Client.ClientID,..);
}
当我试图给应用层一个IQueryable时,问题就来了,这样应用层就可以根据自己的意愿动态创建查询并过滤结果:
public IQueryable<BusinessLogic.Client> Clients()
{
this.MainDB.Clients.Select<ClientDataAccessLayer.Client, BusinessLogic.Client>((ClientDAL1) => Convert(ClientDAL1));
}
ClientLogic().Clients().Where((ClientBL1)=>ClientBL1.ClientID==4);
异常:方法"BusinessLogic.Client Convert(ClientDataAccessLayer.Client("不支持转换为SQL。
这段代码给出了这个异常,我知道为什么,但我找不到更好的解决方案。
请随时帮助我重新设计我的项目,以便应用程序可以动态查询数据库。
谢谢你,斯塔夫·阿尔菲。
您不能将linq中的构造函数调用为sql查询。你必须像这样写你的转换器
// NOTE: this is an expression, not a method
private static Expression<Func<ClientDataAccessLayer.Client, BusinessLogic.Client>> Convert =
x => new BusinessLogic.Client // NOTE: initializer, not a constructor
{
Id = x.Id,
...
};
public IQueryable<BusinessLogic.Client> Clients()
{
this.MainDB.Clients.Select(Convert);
}
假设您的查询中没有其他部分调用任意的、与Linq到SQL不兼容的函数,那么错误应该会消失。