LINQ。想要动态添加where子句。我害怕IO到DB

时间:2012-08-30 09:59:36

标签: c# linq asp.net-web-api

我使用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?

4 个答案:

答案 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来运行实际查询,或者如果要返回要由调用方法的代码执行的表达式。