我正在使用EF与DTO分离的模型,因为我需要为许多类(GetByPrimarykey
,GetBy
,GetAll
等)实现相同的功能,我我觉得抽象课很好:
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
函数被证明是非常有用的。
答案 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。 我希望有所帮助。