我使用ASP.NET Web API和Repository模式 我想动态添加where子句。像,
//controller
static readonly ICustomerRepository repository = new CustomerRepository();
//
var result = repository.GetAll();
if (form['name'] != null) result.Where( p => p.custName.Contains( form['name'].toString() ) );
if (form['attribute1'] != null) result.Where( p => p.attribute1.Equals( form['attribute1'].toString() ) );
return result;
//
有没有担心IO?
答案 0 :(得分:3)
有没有担心IO?
你的意思并不是很清楚,但是当你试图执行它时,查询只会被发送到数据库 - 这可能是在一些调用你的方法的代码中。它不是要为GetAll
执行一次,而是为第一个Where
子句执行一次,然后对第二个Where
子句执行一次。当您开始从IQueryable<>
获取数据时,它将被打包到一个查询中。
答案 1 :(得分:0)
如果您想要多个where子句,请查看我问过的这个问题:Combine LinQ queries
我有类似的问题。我想采取一个查询屏幕,然后相应地应用结果,我得到的答案非常适合我需要的
答案 2 :(得分:0)
如果您访问data-base
,则几乎总是IO
访问,如果没有内存缓存设置。所以这取决于你如何管理data-base
。但总的来说,data-base
已被调整为具有高性能IO
访问权限,因此,直到您不打算编写大规模应用程序,我个人而言,不会担心IO
操作开销像这样的简单查询。
如果您希望优化查询,通过使(例如)单个查询,您可以找到这两个数据之间的关系并在其上生成InnerJoin。
答案 3 :(得分:0)
当您实际获取数据时将执行查询,因此您可以将条件堆栈到它而不会导致它从数据库中获取所有记录。
但是,您必须将结果分配给某些内容,或者您只是创建表达式并将其丢弃:
var result = repository.GetAll();
if (form['name'] != null) {
result = result.Where( p => p.custName.Contains( form['name'].toString() ) );
}
if (form['attribute1'] != null) {
result = result.Where( p => p.attribute1.Equals( form['attribute1'].toString() ) );
}
return result; // or return result.ToList();
考虑是否要在方法结束时通过添加ToList
来运行实际查询,或者如果要返回要由调用方法的代码执行的表达式。