[英]LINQ two Where clauses
有人知道我如何链接我的 where 子句吗?
我想通过在第二个结果中找到的项目过滤我的主列表中的项目。
我有以下示例代码
@foreach (var artikel in Controller.Artikel
.Where(x => x.LieferantenArtikel
.Where(y => y.Lieferant.LieferantId == bestellung.LieferantId)
)
{
<option value="@artikel.Artikelnummer">@artikel.Artikelnummer</option>
}
第一个.Where
只是访问我的对象列表,它具有我需要的真正检查。
您将.Where()
链接到.Where()
在技术上是正确的。 问题是当前情况下的外部.Where()
不会评估为布尔值。 然而,这是一个要求。 .Where()
的目的是为一个集合定义一个过滤器,该过滤器产生该集合的一个子集。 您可以检查.Any()
项目是否满足该条件:
@foreach (var artikel in Controller.Artikel
.Where(x => x.LieferantenArtikel
.Any(y => y.Lieferant.LieferantId == bestellung.LieferantId))
)
{
<option value="@artikel.Artikelnummer">@artikel.Artikelnummer</option>
}
.
为其他答案添加更多上下文,希望可以帮助您了解如何有效地使用 LINQ:
您尝试使用.Where()
编程的内容在技术上是“存在的地方”。 天真地翻译成LINQ,那就是
Controller.Artikel
.Where(x =>
x.LieferantenArtikel
.Where(y => y.Lieferant.LieferantId == bestellung.LieferantId)
.Count() > 0 // naive "exists", but bad; for reasons see below
)
但是.Count() > 0
效率很低,因为这需要执行.Count()
来评估语句,而这又需要确定准确的结果集。
这就是.Any()
地方:它仅通过检查它们并在第一项匹配时立即返回true
来确定IEnumerable
是否至少有一个元素。 因此,只有当没有匹配项时,才必须枚举和检查“LieferantenArtikel”的所有项目,否则将使用较小的子集。
我发现非嵌套 LINQ 更具可读性。 使用SelectMany
事情SelectMany
,然后使用Where
。 请注意,您需要确保在Artikel
实现了Equals()
,这样Distinct()
才能正常工作。
var artikels = Controller.Artikel
.SelectMany(x => x.LieferantenArtikel, (x, l) => (Artikel: x, Lieferant: l))
.Where(x => x.Lieferant.LieferantId == bestellung.LieferantId)
.Select(x => x.Artikel)
.Distinct();
@foreach(var artikel in artikels)
{
<option value="@artikel.Artikelnummer">@artikel.Artikelnummer</option>
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.