0

C#、LINQ to SQL

私の問題の解決策がないため、そのトピックではなく新しいトピックを開くようにアドバイスする人もいます。レイヤーを再設計するには、あなたの助けが必要です。Linq To Sql - DAL レイヤーを DLL として公開せずにアプリケーション レイヤーを動的に検索する


私のプロジェクトは、DAL、BL、アプリケーションの 3 つのレイヤーで構成されています。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 の自動生成コード (この場合は Client クラス) に公開することはできません。そのため、DAL.Client オブジェクトによって BL レイヤーで生成される Client の「複製」クラスを作成しました。

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 への変換がありません。

このコードはこの例外を発生させます。その理由はわかっていますが、この問題に対するより良い解決策を見つけることができません。

アプリケーションが動的に DB を照会できるように、プロジェクトを再設計するのを手伝ってください。

どうもありがとう、スタヴ・アルフィ。

4

1 に答える 1