【问题标题】:Unioning two LINQ queries合并两个 LINQ 查询
【发布时间】:2014-11-24 14:48:20
【问题描述】:

我只需要使用 Linq 进行完全外连接,但是当我合并两个查询时,我得到了这个错误:

实例参数:无法从“System.Linq.IQueryable”转换为“System.Linq.ParallelQuery”

这是我的完整代码:

using (GoodDataBaseEntities con = new GoodDataBaseEntities())
        {
            var LeftOuterJoin = from MyCustomer in con.Customer
                                join MyAddress in con.Address
                                     on MyCustomer.CustomerId equals MyAddress.CustomerID into gr
                                from g in gr.DefaultIfEmpty()

                                select new { MyCustomer.CustomerId, MyCustomer.Name, g.Address1 };

            var RightOuterJoin = from MyAddress in con.Address
                                 join MyCustomer in con.Customer
                                 on MyAddress.CustomerID equals MyCustomer.CustomerId into gr
                                 from g in gr.DefaultIfEmpty()
                                 select new { MyAddress.Address1, g.Name };

          var FullOuterJoin = LeftOuterJoin.Union(RightOuterJoin);
          IEnumerable myList = FullOuterJoin.ToList();

            GridView1.DataSource = myList;
            GridView1.DataBind();
        }

【问题讨论】:

  • Union 期望 IEnumerables 具有相同的类型 - 您的 IEnumerables 不是同一类型。不能这样使用联合。
  • 您正在合并具有不同属性的两种不同对象类型,这是行不通的。如果将MyAddress.CustomerID 添加到第二个匿名返回类型以使属性匹配,我不知道编译器有多聪明。
  • LeftOutterJoins with LINQ 一个简单的网络搜索会产生大量的结果/示例

标签: c# asp.net sql-server linq entity-framework


【解决方案1】:

你的两个序列的类型不一样,所以不能Union

new { MyCustomer.CustomerId, MyCustomer.Name, g.Address1 };
new { MyAddress.Address1, g.Name };

尝试确保字段具有相同的名称和类型且顺序相同。

【讨论】:

    【解决方案2】:

    为什么不把它全部选为一件事呢?根据您的设置(即,如果您在表上正确设置了外键),您不需要进行显式连接:

     var fullJoin = from MyCustomer in con.Customer
                    select new { 
                        MyCustomer.CustomerId, 
                        MyCustomer.Name, 
                        MyCustomer.Address.Address1,
                        MyCustomer.Address.Name
                    };
    

    方法语法:

    var fullJoin = con.Customers.Select(x => new 
    { 
        x.CustomerId, 
        x.Name, 
        x.Address.Address1,
        x.Address.Name
    });
    

    【讨论】:

    • 感谢 DLeh,但是当我键入 MyCustomer.Address 时,我找不到 Address1。你能帮我吗
    • 名称可能不同,请查看MyCustomer.Address 中的哪些属性并选择合适的。这不是火箭手术
    【解决方案3】:

    union 将一个集合中的项目附加到另一个集合的末尾,因此如果每个集合有 5 个项目,那么新集合将有 10 个项目。

    您似乎想要的是最终得到 5 行,每行都有更多信息。这不是Union 的工作。您可能可以使用Zip() 来完成此操作,但您最好使用 DLeh 所示的单个查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多