我正在开发一个数据库访问层项目,并决定使用Linq to SQL。我想做的一件事是提供一个API,可以将Linq表达式作为参数来检索数据。例如,我现在编写了这个API,如下所示:
public Result GetResults(System.Linq.Expressions.Expression<Func<Result, bool>> predicate)
{
Result result = db.Results.SingleOrDefault(predicate);
return result;
}
然后,您可以使用此API在数据库中查询满足特定条件的Result行,例如:
Result result = Provider.GetResults(r => r.ID == 11);
这非常有效。根据我的条件,我能够得到我想要的一行。
下一步是为了能够从数据库中获取多个对象。
我开始工作的方式是这样的:
public List<Result> GetResults(System.Linq.Expressions.Expression<Func<Result, bool>> predicate)
{
List<Result> results = db.Results.Select(r => r).Where(r => r.ID == 11).ToList<Result>();
return results;
}
正如您所看到的,我使用r =&gt;调用Select r,这给了我一切,然后我用Where过滤到我需要的东西。
它有效...但有些东西告诉我,我做的很难看。我可能是错的,但这不会从结果表中取出一切然后过滤它吗?或者它是否将在数据库级别进行过滤的正确SQL语句组合在一起?
无论如何......我非常感谢有关如何完成这项任务的一些指导。如何编写一个以Linq Expression为参数的API,并根据该表达式从数据库中返回一组对象。
谢谢!
答案 0 :(得分:1)
Select(r=>r)
什么都不做(除了从Table<T>
更改为IQueryable<T>
- 但没有有用)。我假设您打算将predicate
传递给Where
?
实际上,不拉出所有内容并对其进行过滤 - 生成相应的WHERE
(TSQL)子句。这是可能的,因为“延迟执行”和“可组合性” - 意思是:在您开始迭代数据(在ToList()
中)之前,它实际上并不执行任何操作 - 直到那时您只是简化了查询。
你可以通过做类似的事情来看到这一点:
db.Log = Console.Out;
并查看TSQL。或者运行TSQL跟踪。为了使它更漂亮,将其简化为:
return db.Results.Where(predicate).ToList();
答案 1 :(得分:0)
我知道你说你想传递一个谓词并返回一个List,但是你考虑过返回一个IQueryable
然后你可以打电话:
GetResults().Where(r => r.SomeProperty == "SomeValue")
.OrderBy(r => r.SomeOtherProperty)
.Skip(10)
.Take(10); //etc.
使用您当前的API设计,您将返回所有记录,然后必须获得10,其中上面只返回您需要的10个...
只是一些想法......