繁体   English   中英

LINQ 两个 Where 子句

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM