【问题标题】:Concatenate IQueryable starting with Empty IQueryable in VB在 VB 中以 Empty IQueryable 开头连接 IQueryable
【发布时间】:2015-05-14 21:43:49
【问题描述】:

我正在尝试连接多个 LINQ 请求返回(所有返回都是 IQueryable)。

我的问题是我需要从 Empty IQueryable 变量开始,但“.Concat”方法不适用于“Nothing”变量。

我想知道你是否有办法做到这一点?

PS:您可以将多个“Where”请求用作“AND”,但不能用作“OR”(Seq.Where(Seq.Where()))。我试图通过连接多个请求来完成后者。另外,如果我做了一个不可能的请求(一个返回不匹配的请求),它可以工作,但这显然不是一个好主意。

还是谢谢你。祝你有美好的一天。

【问题讨论】:

  • 绝对是XY problem。使用PredicateBuilder 来获取多个OR 条件。
  • 有很多方法可以执行“OR”,具体取决于您需要通过 AggregateIntersectsContainsAny 执行的 OR。

标签: vb.net linq concat iqueryable nothing


【解决方案1】:

最后我不得不在列表的第一项上做一次我的请求,然后删除该项目。之后,我可以简单地为每个做一个(使用“包含”来查询我的数据库)。

不过,我认为这并不是一个真正的答案。它看起来很像 hack。

我没有找到使用 linq 进行查询的方法。

我正在使用 Contains 查询我的数据库并验证 x 是否在数据库中。但我不得不为此获取 x 列表。

【讨论】:

  • 我也有同样的情况。到目前为止,我所做的是使用不返回任何行的 LINQ 查询,并且由于某种原因,它工作正常。新列表(如罗伯特的回答)和 Enumerable.Empty<> 不起作用。
【解决方案2】:

试试:

var start=(new List<something>()).AsQueryable();

尽管这可能仅在您的 IQueryable 位于同一源(在本例中为对象)时才有效。我建议尝试通过AggregateIntersectsContainsAnyPredicateBuilder 找出正确执行“OR”的 LINQ 方法。

【讨论】:

  • 我已经使用“包含”来查询我的数据库以测试 x 是否在其中。我必须测试 x 列表中的所有 x,并且对于每个 x,我都必须测试包含。我不知道如何用 LINQ 做到这一点。
  • 如果您提供一些示例数据、输入和想要的输出,我相信我们可以帮助您。
【解决方案3】:

我正在努力解决同样的问题。我发现了两个可以帮助你但有一个缺点的选项。

不要使用AsQueryable()(在其他帖子中建议),试试这些(对不起,只是 C# 代码,但我想它可能还是有用的)

var query = new List<ServiceTicketCombinedHistory>().Take(0);
var query = Enumerable.Empty<ServiceTicketCombinedHistory>();
// Optionally:
var query = Enumerable.Empty<ServiceTicketCombinedHistory>().Take(0);

我的问题是我的查询有一个Where(x =&gt; x.Field.Contains(value)),使用这些选项,这种比较似乎是在内存上完成的,并且区分大小写。通过使用空的 LINQ 查询结果(就像您所做的那样),比较似乎是在 数据库 中使用 LIKE 完成的,并且是不区分大小写的。有关此差异的更多信息here

我使用的 LINQ 查询方法不是删除项目,而是在整个查询中添加 Take(0)(您必须用括号括起来)。这会产生最简单的 SQL Server 执行计划。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-09
    • 2020-11-10
    • 2013-09-03
    • 1970-01-01
    • 2017-08-29
    • 2010-12-01
    • 2016-09-01
    相关资源
    最近更新 更多