【问题标题】:LINQ. Want to add where clause dynamically. I'm afraid of IOs to DBLINQ。想要动态添加 where 子句。我害怕 IO 到 DB
【发布时间】:2012-08-25 00:45:37
【问题描述】:

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

【问题讨论】:

  • “不怕IO吗?” - 你能翻译一下这句话吗?完全不清楚这意味着什么。
  • 更多细节/更多规范。为防止误解,请勿使用快捷方式。
  • IOs 是,我的意思是数据库访问,对数据库的 SQL 查询。怕是多次执行SQL。

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


【解决方案1】:

不怕IO吗?

你的意思不是很清楚,但查询只会在你尝试执行它时发送到数据库 - 这大概是在一些调用你的方法的代码中。它不会对GetAll 执行一次,然后对第一个Where 子句执行一次,然后对第二个Where 子句执行一次。当您开始从IQueryable<> 获取数据时,它们将全部打包到一个查询中。

【讨论】:

  • 谢谢。 “只有当您尝试执行查询时,查询才会发送到数据库”我只想知道。
  • 乔恩,你在这里处理 IO 真的很好;-)
【解决方案2】:

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

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

【讨论】:

  • 谢谢。我读了链接。直接添加where子句(我的模式)和使用过滤器添加where子句(链接答案)有什么区别吗?
  • 是的,你得到所有记录,然后你剥离一些,然后再剥离更多,你会做更多的处理.. 而如果你告诉它一击完成,它更像是“得到我的东西通缉”
  • 我认为,链接答案的方式与在 foreach 循环行“foundfiles.Where(filterToApply)”中“剥离”几次相同。如果我的想法有什么问题吗?
【解决方案3】:

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

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

【讨论】:

  • hm,在这种情况下,IO 可能意味着“InvalidOperation”吗?
  • 对我来说似乎 OP 正在谈论 IO 存储访问。
  • 对不起,我的问题不清楚。我想知道sql查询什么时候执行。
【解决方案4】:

查询将在您实际获取数据时执行,因此您可以将条件堆叠到它,而不会导致它从数据库中获取所有记录。

但是,您必须将结果分配给某些东西,否则您将只是创建表达式并将它们丢弃:

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 来运行实际查询,还是要返回要由调用该方法的代码执行的表达式。

【讨论】:

  • 谢谢。我对 LINQ 有了更深入的了解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 2010-09-15
  • 2012-12-28
  • 1970-01-01
  • 2023-03-29
  • 2019-07-06
  • 2014-12-19
相关资源
最近更新 更多