Linq 全外连接错误
Linq Full Outer Join Error
我使用 Linqpad 连接到 Adventure Works 2012 数据库,如下所示:
我正在尝试编写完整的外部联接。我的研究告诉我它应该看起来像这样(如屏幕截图所示):
var LeftOuterJoin = from p in Products
join pv in ProductVendors on p.ProductID equals pv.ProductID into ppv
from pv in ppv.DefaultIfEmpty()
select new {ProductName = p.Name};
var RightOuterJoin = from v in Vendors
join pv in ProductVendors on v.BusinessEntityID equals pv.BusinessEntityID into ppv
from pv in ppv.DefaultIfEmpty()
select new {VendorName = v.Name};
LeftOuterJoin.Union(RightOuterJoin);
但是截图中的错误(见截图)是:
'System.Linq.IQueryable<AnonymousType#1>' does not contain a definition for 'Union' and the best extension method overload 'System.Linq.ParallelEnumerable.Union<TSource>(System.Linq.ParallelQuery<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments
Instance argument: cannot convert from 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Linq.ParallelQuery<AnonymousType#2>'
问题是什么?
如我所见,存在类型问题,两种匿名类型都有不同的 属性,因此这将导致使用 Union 时出现问题。您可以创建具有相同 属性 的通用类型并使用它。或者同时拥有 属性 并根据查询使用 Like:
var LeftOuterJoin = from p in Products
join pv in ProductVendors on p.ProductID equals pv.ProductID into ppv
from pv in ppv.DefaultIfEmpty()
select new {VendorName = "",
ProductName = p.Name,};
var RightOuterJoin = from v in Vendors
join pv in ProductVendors on v.BusinessEntityID equals pv.BusinessEntityID into ppv
from pv in ppv.DefaultIfEmpty()
select new {VendorName = v.Name,
ProductName = "",};
var result = LeftOuterJoin.Union(RightOuterJoin).ToList(); // force execution to get results.
如果您使用的是 LinqPad,请使用此选项
var result = LeftOuterJoin.Union(RightOuterJoin)
result .Dump();
这对你有用。
我使用 Linqpad 连接到 Adventure Works 2012 数据库,如下所示:
我正在尝试编写完整的外部联接。我的研究告诉我它应该看起来像这样(如屏幕截图所示):
var LeftOuterJoin = from p in Products
join pv in ProductVendors on p.ProductID equals pv.ProductID into ppv
from pv in ppv.DefaultIfEmpty()
select new {ProductName = p.Name};
var RightOuterJoin = from v in Vendors
join pv in ProductVendors on v.BusinessEntityID equals pv.BusinessEntityID into ppv
from pv in ppv.DefaultIfEmpty()
select new {VendorName = v.Name};
LeftOuterJoin.Union(RightOuterJoin);
但是截图中的错误(见截图)是:
'System.Linq.IQueryable<AnonymousType#1>' does not contain a definition for 'Union' and the best extension method overload 'System.Linq.ParallelEnumerable.Union<TSource>(System.Linq.ParallelQuery<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments
Instance argument: cannot convert from 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Linq.ParallelQuery<AnonymousType#2>'
问题是什么?
如我所见,存在类型问题,两种匿名类型都有不同的 属性,因此这将导致使用 Union 时出现问题。您可以创建具有相同 属性 的通用类型并使用它。或者同时拥有 属性 并根据查询使用 Like:
var LeftOuterJoin = from p in Products
join pv in ProductVendors on p.ProductID equals pv.ProductID into ppv
from pv in ppv.DefaultIfEmpty()
select new {VendorName = "",
ProductName = p.Name,};
var RightOuterJoin = from v in Vendors
join pv in ProductVendors on v.BusinessEntityID equals pv.BusinessEntityID into ppv
from pv in ppv.DefaultIfEmpty()
select new {VendorName = v.Name,
ProductName = "",};
var result = LeftOuterJoin.Union(RightOuterJoin).ToList(); // force execution to get results.
如果您使用的是 LinqPad,请使用此选项
var result = LeftOuterJoin.Union(RightOuterJoin)
result .Dump();
这对你有用。