可以将此代码转换为单个linq语句吗?

时间:2013-06-27 20:22:58

标签: linq

我正在尝试从实体框架实体中过滤列表中的列表。

我设法让代码工作,但我不相信这是实现目标最干净的方法。

这是我到目前为止的代码:

        foreach (var n1 in tier.MatchNodes)
        {
            n1.LenderMatchNodes = n1.LenderMatchNodes.Where(x => x.Commission == 0).ToList();
        }

实际上MatchNodes包含一组LenderMatchNodes,但我想只返回佣金== 0的节点。

提前致谢。

2 个答案:

答案 0 :(得分:0)

尝试

tier.MatchNodes.ToList().ForEach(n1=>n1.LenderMatchNodes = n1.LenderMatchNodes.Where(x => x.Commission == 0).ToList());

答案 1 :(得分:0)

尝试使用SelectMany():

var result = dataContext.Table<Tier>()
    .Where(some condition to get you the tier)
    .SelectMany(tier => tier.MatchNodes)
    .SelectMany(node => node.LenderMatchNodes)
    .Where(x => x.Commission == 0)
    .ToList();

这具有能够执行单个SQL查询的额外好处。

如果您的目标是实际更新数据库中的节点列表,您仍然可以使用Include()最小化查询数量(假设您使用的是EF):

var nodes = dataContext.Table<Tier>()
        .Where(some condition to get you the tier)
        .SelectMany(tier => tier.MatchNodes)
        .Include(node => node.LenderMatchNodes) // loads this eagerly
        .ToList();
nodes.ForEach(n => n.LenderMatchNodes = n.LenderMatchNodes.Where(condition));