1

私はEntityFrameworkを初めて使用しますが、次のことに固執しています。

EDMXモデルにインポートした既存のデータベースがあります。

私のエンティティのいくつかは、「所有者」の同じ概念を共有しています。

各エンティティには、「所有者」のカスタム名があります。フランス語の「auteur」では、「作者」、「所有者」、「所有者」と呼ばれることもあります。

そこで、単純なインターフェイスを実装し、部分的なクラスを作成して、エンティティがすべて同じ名前の「所有者」の概念を共有できるようにしました。

public interface IAPIResource
{
    int owner { get; }
}

そして、エンティティBlogPostの私の部分的なクラス

public partial class BlogPost : IAPIResource
{
    public int owner { get { return auteur; } }
}

LINQToEntitiesクエリで使用したいのですが、IAPIResourceはエンティティタイプではないため、LINQはそれが不可能であると教えてくれます。

public List<T> GetFilteredEntities<T>(int owner, IQueryable<T> entities, MyDBContext db)
{
    return entities.Where(e => ((IAPIResource)e).owner == owner).ToList();
}

.GetTypeReflection(および.GetPropertyおよび)を試しまし.GetValueたが、LINQもそれをサポートしていません。

私もPOCOを試しましたが、あまり運がありません。

また、抽象エンティティなどでDBモデルを変更したくありません。

LINQ式に飛び込むことなく簡単な解決策を持っている人はいますか?

注意:実際のクエリははるかに複雑です。そのため、Expressionを使用するつもりはありません。

ありがとうございました。

4

1 に答える 1

2

Entity Frameworkは、への明示的なキャストをサポートしていIAPIResourceませんが、それは必要ありません。

public List<T> GetFilteredEntities<T>(int owner, IQueryable<T> entities, MyDBContext db)
    where T : class, IAPIResource
{
    return entities.Where(e => e.owner == owner).ToList();
}

ownerただし、これには、実装クラスでプロパティをマップする必要があります。あなたは現在持っています

public int owner { get { return auteur; } }

ただし、Entity Frameworkはそれを認識せず、同じプロパティownerであるため、これは機能しません。auteurこれを少し変更する必要があります。私の個人的な好みは、これを好転させることです。その逆ではなくauteur、ラッパープロパティを作成します。そうすれば、コードやクエリでowner引き続き使用できます。auteurowner

于 2012-11-22T10:52:59.210 に答える