2

私は Entity Framework を使用してドメイン モデルにアクセスしています。これらはすべて、アイテムが公開されているかどうかを示すプロパティを指定するインターフェイス (IPublishable) を実装しています。

フロントエンドからアイテムにアクセスするとき、私は常に未公開のアイテムを除外したいと考えています。したがって、クエリを作成するたびに、これと同様のことを行っています (次の DbSets Objects1 と Objects2 の両方が実装されています)。IPublishable

context.Objects1.Where( x => x.IsPublished ...).OrderBy( x => x.Id).ToList()
context.Objects2.Where( x => x.IsPublished ...).First()

理想的なのは、Web アプリ内のすべてのクエリに共通Where()句を挿入できる場合、または各クエリに含めることができる拡張メソッドを作成する方法がある場合です。

すべてのlinqクエリの拡張メソッドを作成しようとしました

public static IEnumerable<T> FrontEnd<T>(this DbSet<T> dbSet) where T : class {
  return dbSet.Cast<IPublishable>().Where( x => x.IsPublished ...).Cast<T>();
}

そして、このように使用します...

context.Objects1.FrontEnd().Where( x => ...).OrderBy(...

ただし、「LINQ to Entities は EDM プリミティブまたは列挙型のキャストのみをサポートしています」というエラーが表示されます

私はEFを初めて使用するので、どんな情報でも大いに役立ちます。ありがとう

4

2 に答える 2

2

コメントに従って更新-これは機能します

public static IQueryable<T> FrontEnd<T>(this DbSet<T> dbSet)
    where T : class, IPublishable
{
    return dbSet.Where(x => x.IsPublished);
}

次のように使用できます。

context.Objects1.FrontEnd().Where( x => ...).OrderBy(...

次のオプションのいずれかを試すことができます。

public static IQueryable<dynamic> FrontEnd(this DbSet<dynamic> dbSet)
{
    return dbSet.Where(x => (x as IPublishable).IsPublished);
}

また

public static IQueryable<T> FrontEnd<T>(this DbSet<T> dbSet)
    where T : class, IPublishable
{
    return dbSet.Where(x => x.IsPublished);
}

ノート:

最初のオプションは動的を使用するため、FrontEnd() への呼び出しでタイプを指定する必要がある 2 番目のオプションでは遅くなります。

context.Objects1.FrontEnd<Objects1>().Where( x => ...).OrderBy(...
于 2013-07-05T14:14:08.670 に答える