-4

我使用 ASP.NET Web API 和存储库模式。
我想动态添加 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

4 回答 4

3

不怕IO吗?

您的意思不是很清楚,但是只有在您尝试执行查询时才会将查询发送到数据库 - 这可能在某些调用您的方法的代码中。它不会执行一次 for GetAll,然后执行第一个Where子句一次,然后执行一次第二个Where子句。当您开始从IQueryable<>.

于 2012-08-30T10:01:07.353 回答
0

如果你想要多个 where 子句,看看我问的这个问题:Combine LinQ queries

我有一个类似的问题。我想进行查询屏幕,然后相应地应用结果,我得到的答案非常适合我的需要

于 2012-08-30T10:02:17.130 回答
0

如果您访问data-base,几乎总是IO可以访问,如果没有一些内存缓存设置。所以就看你怎么管理了data-base。但总的来说,data-base它被调整为具有高性能IO访问,所以在你不打算编写大规模应用程序之前,我个人不会担心IO像这样的简单查询的操作开销。

如果您想优化查询,通过(比如说)一个查询,您可以找到这两个数据之间的关系并在它们上进行InnerJoin

于 2012-08-30T10:02:40.203 回答
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,或者是否要返回要由调用该方法的代码执行的表达式。

于 2012-08-30T10:06:44.960 回答