【问题标题】:Merge two LINQ expressions into one将两个 LINQ 表达式合并为一个
【发布时间】:2017-02-07 22:11:27
【问题描述】:

我创建了两个 LINQ 查询来提取相同类型的值,但基于数据库中的不同引用。

var productGroupIdList = (from organizationalUnit 
                          in user.OrganizationalUnit
                          from productGroup 
                          in organizationalUnit.ProductGroup
                          select productGroup.ProductGroupId).ToList();
productGroupIdList.AddRange(from subOrganizationalUnit 
                            in user.SubOrganizationalUnit
                            from productGroup 
                            in subOrganizationalUnit.ProductGroup
                            select productGroup.ProductGroupId);

有没有办法将它们连接到一个 LINQ 查询中?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    只要它们具有完全相同的结构,您应该可以使用Concat(),它在 SQL 中转换为UNION ALL

    var productGroupIdList = (from organizationalUnit 
                          in user.OrganizationalUnit
                          from productGroup 
                          in organizationalUnit.ProductGroup
                          select productGroup.ProductGroupId)
                       .Concat(
                            from subOrganizationalUnit 
                            in user.SubOrganizationalUnit
                            from productGroup 
                            in subOrganizationalUnit.ProductGroup
                            select productGroup.ProductGroupId)
                       .ToList();
    

    【讨论】:

    • 没有办法用一个查询做到这一点?
    • @MarekCzaplicki:从技术上讲,这一个 LINQ 查询--Concat() 是 LINQ 的一部分。可能有更简洁的方法来完成同样的事情:例如,您可以从context.ProductGroups 开始,然后查询任何OrganizationalUnits 或SubOrganizationalUnits 与他们关联的适当用户。
    【解决方案2】:

    你如何只连接两个查询的一部分:第一部分,因为第二部分是相同的?

    var productGroupIdList = from productGroup in 
                (from organizationalUnit in user.OrganizationalUnit
                select organizationalUnit.ProductGroup)
                .Concat(
                    from subOrganizationalUnit 
                    in user.SubOrganizationalUnit
                    select subOrganizationalUnit.ProductGroup)
            select productGroup.ProductGroupId;
    

    或查看扩展示例,其中 combineProductGroups 是一个单独的变量(这是您的查询的第一部分,用于两个列表的组合)

    class Program
    {
        static void Main(string[] args)
        {
            var user = new User();
    
            var combinedProductGroups = (from organizationalUnit
                    in user.OrganizationalUnit
                    select organizationalUnit.ProductGroup)
                .Concat(from subOrganizationalUnit
                    in user.SubOrganizationalUnit
                    select subOrganizationalUnit.ProductGroup);
    
            var productGroupIdList = from productGroup in combinedProductGroups
                    select productGroup.ProductGroupId;
    
        }
    }
    
    public class User
    {
        public List<OrgUnit> OrganizationalUnit;
        public List<SubOrgUnit> SubOrganizationalUnit;
    }
    
    public class OrgUnit
    {
        public ProdGroup ProductGroup;
    }
    
    public class SubOrgUnit
    {
        public ProdGroup ProductGroup;
    }
    
    public class ProdGroup
    {
        public string ProductGroupId;
    }
    

    【讨论】:

      【解决方案3】:

      如果表的结构相同,我猜你也许可以

      var result = user.OrganizationalUnit.SelectMany(x => x.ProductGroup.ProductGroupId)
        .Concat(user.SubOrganizationalUnit.SelectMany(x => x.ProductGroup.ProductGroupId)).ToList();
      

      【讨论】:

      • 你不能连接 suo 和 uiszczeniem,但是你可以连接 UO.pg 和 suo.pg :)
      • @MarekCzaplicki 我几乎在猜测,因为我没有任何使用 LINQ to SQL 的经验,但也许更新的版本更有可能工作。它仍然是 2 个查询,但看起来像一个 :] 并且应该像其他答案一样转换为一个 SQL 查询
      • 抱歉之前的评论有错误,但您之前的回答与我所寻找的非常接近。我已经发布了一个新的答案。看看
      【解决方案4】:

      根据你的所有回答我做了这个

      var productGroupIdList = (from organizationalUnit 
                                in user.OrganizationalUnit
                                from subOrganizationalUnit
                                in user.SubOrganizationalUnit
                                from productGroup 
                                in organizationalUnit.ProductGroup.Concat(subOrganizationalUnit.ProductGroup)
                                select productGroup.ProductGroupId).Distinct().ToList();
      

      我也使用 Lambda 创建了这个

      user.OrganizationalUnit.SelectMany(x => x.ProductGroup)
          .Concat(user.SubOrganizationalUnit.SelectMany(x => x.ProductGroup))
          .Select(x => x.ProductGroupId)
          .Distinct()
          .ToList()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多