1

我正在使用与 DTO 分离的模型的 EF,并且由于我需要为许多类(GetByPrimarykey、等)实现相同的功能GetByGetAll我认为拥有抽象类会很好:

       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 时,我看到选择没有 where 原因。如果我覆盖该GetByPrimaryKey功能:

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

查询很好,但是我真的需要预测才能工作,因为我们的GetBy功能被证明非常有用。

4

1 回答 1

3

您需要使用 Expression 才能获得 SQL 翻译。例如

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 中的方法,而不是 IEnumerable,因为 IQueryable 的方法被转换为 SQL。我希望这会有所帮助。

于 2013-02-20T19:20:23.647 回答