【问题标题】:two foreach in linq?linq中的两个foreach?
【发布时间】:2014-09-19 14:09:15
【问题描述】:

...我已经尝试了一些方法,但我得到了“本地序列不能在 LINQ to SQL 实现的查询运算符中使用,但包含运算符除外。”例外。 我说的是这个:

Query = Query.Where(t => this.SysTextBox.Text.CSL2Array().All(ss => t.SysName.Contains(ss)));

我对此有点陌生,但我一直在努力让它发挥作用。先感谢您!

【问题讨论】:

  • 什么是CSL2Array
  • 哦。它只返回一个包含来自 SubSystemTextBox.Text 的单词的数组。它用逗号分割字符串。
  • 显然查询提供程序无法将其转换为 SQL 代码。您不必在表达式内部执行此操作,这就是错误消息告诉您的内容。
  • 知道了。所以我不能用 linq 做到这一点。
  • 你不能用 LINQ 做那个特定的操作,这并不意味着你不能用 LINQ 做剩下的任何事情。您的原始解决方案存在 的问题,从多次迭代序列,在应用程序端完成所有工作,而不是在数据库端完成任何工作,错误的印象是返回的可查询对象可以在不进行评估的情况下进一步细化,在搜索/删除时通过大型集合进行大量线性搜索,在整个地方重新计算值等等。

标签: c# linq foreach


【解决方案1】:

ToList之后应该可以查询了:

Query = Query.ToList<TagsDeleted>()
             .Where(t => this.SubSystemTextBox.Text.CSL2Array().All(ss => t.SubsystemName.Contains(ss)))
             .AsQueryable<TagsDeleted>();

但这并不容易阅读,我将重构以下内容以明确“我创建了一个列表,并希望删除一些项目”:

var words = this.SubSystemTextBox.Text.CSL2Array();
var list = Query.ToList<TagsDeleted>();
list.RemoveAll(t => !words.All(word => t.SubsystemName.Contains(word)));
Query = list.AsQueryable<TagsDeleted>();

【讨论】:

  • 所以 ToList 可以做到这一点。这就是我要找的,谢谢!! :)
  • 使用AsEnumerable而不是ToList可能会更快。
【解决方案2】:
var arr = this.SubSystemTextBox.Text.CSL2Array();
var notContained = Query.Where(td=>arr.Any(ss => !td.SubsystemName.Contains(ss)));
Query = Query.Except(notContained);

你可以在一行中弄清楚如何做到这一点,这只是为了清楚。

【讨论】:

  • 再一次,“本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains 运算符除外。” :(
  • 但是是的,这就是我想要做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多