联合两个LINQ查询

时间:2014-11-24 14:48:20

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

我只需要与Linq进行完全外连接,但是当我联合两个quire时,我得到了这个错误:

enter image description here

实例参数:无法从'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();
        }

3 个答案:

答案 0 :(得分:2)

两个序列的类型不一样,因此您无法执行Union

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

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

答案 1 :(得分:1)

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

 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
});

答案 2 :(得分:0)

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

你似乎想要的是最终得到5行,每行都有更多的信息。这不是Union的工作。您可以使用Zip()执行此操作,但您对DLeh所示的单个查询确实最合适。