使用Linq使用方法语法查找表中具有特定值的所有记录

时间:2017-02-06 22:12:11

标签: c# linq

这个Linq查询语法可以正常工作并返回我需要的内容,但我希望使用Method语法理解等效查询。

from r in Resources 
        from t in r.Teams
        where t.Id ==1
        select r

资源表和团队表有多对多的关系。

流利或方法语法是什么?

3 个答案:

答案 0 :(得分:1)

Resources
    .SelectMany(x => x.Teams, (resource, team) => new { Resource = resource, Team = team })
    .Where(x => x.Team.Id == 1)
    .Select(x => x.Resource);

答案 1 :(得分:0)

此查询有效:

Teams.Where(t => t.Id == 1).SelectMany(r => r.Resources)

答案 2 :(得分:0)

两个from子句相当于SelectMany运算符。但在这种情况下,它将是SelectMany运算符的重载,它还在每个元素上调用结果选择器函数:

public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, IEnumerable<TCollection>> collectionSelector,
    Func<TSource, TCollection, TResult> resultSelector
)

它不仅可以压缩资源序列,还可以生成包含资源和团队

的新序列
Resources.SelectMany(r => r.Teams, (r,t) => new { r, t })
         .Where(x => x.t.Id == 1)
         .Select(x => x.r)

注意:如果您不尝试将查询语法转换为方法语法,但只关注相同的结果,那么您也可以使用以下查询(如果资源团队中存在重复,结果会略有不同 - 您将不能通过此查询获得重复的资源)

Resources.Where(r => r.Teams.Any(t => t.Id == 1))