实体框架在查询外生成谓词函数

时间:2013-02-20 18:47:53

标签: c# entity-framework

我正在使用EF与DTO分离的模型,因为我需要为许多类(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没有where cause。如果我覆盖GetByPrimaryKey函数:

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

查询很好但是,我确实需要预测工作,因为GetBy函数被证明是非常有用的。

1 个答案:

答案 0 :(得分:3)

您需要使用Expression才能获得SQL转换。 e.g。

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。 我希望有所帮助。