应用层如何能够在DAL层中动态查询数据库

本文关键字:动态 查询 数据库 DAL 何能够 应用层 | 更新日期: 2023-09-27 18:06:33

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。

这段代码给出了这个异常,我知道为什么,但我找不到更好的解决方案。

请随时帮助我重新设计我的项目,以便应用程序可以动态查询数据库。

谢谢你,斯塔夫·阿尔菲。

应用层如何能够在DAL层中动态查询数据库

您不能将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不兼容的函数,那么错误应该会消失。