1

私は DTO から分離されたモデルで EF を使用しています。多くのクラス ( GetByPrimarykeyGetByGetAllなど) に同じ関数を実装する必要があるため、抽象クラスがあればいいと思いました。

       protected List<T> GetBy(Func<T, bool> func)
        {
            return WorkingSet.Where(func).ToList();
        }
        protected T GetFirstBy(Func<T, bool> func)
        {
            return WorkingSet.FirstOrDefault(func);
        }
        public virtual T GetByPrimaryKey(K key)
        {
           return WorkingSet.FirstOrDefault(GetByKeyPredict(key));
        }

次に、実装クラスで予測関数を単純に実装します。

protected override Func<MyType, bool> GetByKeyPredict(int key)
{
   return (c=> c.MyTypeId==key);
}

問題は、SQL Server Profiler を実行すると、select に原因がないことがわかります。関数をオーバーライドするとGetByPrimaryKey:

public override MyTypeGetByPrimaryKey(int key)
{
    return WorkingSet.FirstOrDefault(s => s.MyTypeId== key);
}

GetByクエリは問題ありませんが、関数が非常に役立つことが証明されているため、予測が機能することが本当に必要です。

4

1 に答える 1

3

SQL変換を取得できるようにするには、Expressionを使用する必要があります。例えば

protected List<T> GetBy(Expression<Func<T, bool>> func)
        {
            return WorkingSet.Where(func).ToList();
        }
        protected T GetFirstBy(Expression<Func<T, bool>> func)
        {
            return WorkingSet.FirstOrDefault(func);
        }

IQueryableのメソッドはSQLに変換されるため、この場合の目標は、IEnumerableではなくIQueryableのメソッドを使用することです。それがお役に立てば幸いです。

于 2013-02-20T19:20:23.647 に答える