8

単一のビジネス ロジック クラスを使用して、さまざまなエンティティ フレームワーク クラスに対して同様の操作を実行したい状況があります。これらのクラスが部分クラス ファイルで実装するインターフェイスを定義しました。

ただし、これらのインターフェイス メソッドに対して LINQ to entities クエリを作成しようとすると、クエリがクラスのプロパティを直接使用するのではなく、インターフェイスを介して使用されるため、NotSupportedException が発生します。

データベース層への負担を軽減したいので、オブジェクトへの LINQ に頼らずにこれを達成する方法はありますか?

これは私の問題を示すコードです (ファクトリによって作成された汎用リポジトリ クラスを使用しています)。

public interface INamedEntity
{
    int ID { get; set; }
    string Name { get; set; }
}

// This is an Entity Framework class which has CustomerID and CustomerName properties.
public partial class Customer: INamedEntity
{
    int INamedEntity.ID
    {
        get { return this.CustomerID; }
        set { this.CustomerID = value; }
    }
    string INamedEntity.Name
    {
        get { return this.CustomerName; }
        set { this.CustomerName = value; }
    }
}

...

public string GetName<T>(int entityID) where T: EntityObject, INamedEntity
{
    using(var repository = RepositoryFactory.CreateRepository<T>())
    {
        return repository
            .Where(e => e.ID == entityID)
            .Select(e.Name)
            .Single();
    }
}
4

3 に答える 3

6

これはサポートされていません。Linq-to-entities クエリでは、エンティティのマップされたプロパティのみを使用できます。インターフェイス プロパティを使用する場合、プロパティの実装でコードを分析できないため、EF はそれらを SQL に変換する方法を知りません。

エンティティにインターフェイスを使用しないでください - EF はそれをまったくサポートしていません。特別なケースでは、マッピングに不明なプロパティを照会しているため、他の ORM では機能しません。これには、クエリを実際のマップされたプロパティを使用するクエリに変換する独自の Linq プロバイダーを構築する必要があります。

于 2012-02-17T10:45:04.637 に答える
1

動的クエリ ライブラリ ( http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx ) を使用できます。

        if (typeof (INamedEntity).IsAssignableFrom(typeof (T)))
        {
            q = q.Where("ID ==@0", id);
        }
于 2013-08-02T12:11:13.590 に答える
0

次の例外は、ジェネリック ソースに基づくクエリの実行中に発生し、where 句でインターフェイス メンバーが使用されます。

NotSupportedException: インターフェイス メンバー [InterfaceName].[MemberName] のマッピングはサポートされていません。

例外は、クエリが複数のアイテムを返す必要があり、== 演算子を使用した場合にのみ発生します。First、FirstOrDefault、または Single でクエリを実行したとき、または where 句で equals などの演算子を使用したときに、エラーを再現できませんでした。

参考:インターフェース非対応

于 2012-02-17T10:35:19.527 に答える