我在数据库上执行LINQ查询时遇到以下错误:
演员价值类型' System.Int32'失败,因为物化 value为null。
我相信它是因为其中一列返回null。这是我的LINQ命令:
var facts = (from b in Program.db.ProductBrands
join bm in Program.db.BrandManufacturers on b.ProductBrandID equals bm.ProductBrandID
join c in Program.db.Companies on bm.ProductManufacturerID equals c.CompanyID
join s in Program.db.AnimalSources on b.AnimalCode equals s.AnimalCode
join ba in Program.db.BrandAccreditations on b.ProductBrandID equals ba.ProductBrandID into bax
from credJoins in bax.DefaultIfEmpty()
join a in Program.db.Accreditations on credJoins.AccreditationID equals a.AccreditationID into ax
from accreds in ax.DefaultIfEmpty()
join bt in Program.db.BrandTypes on b.ProductBrandID equals bt.BrandTypeID into btx
from brandJoins in btx.DefaultIfEmpty()
join t in Program.db.ProductTypes on brandJoins.ProductTypeID equals t.ProductTypeID into tx
from types in tx.DefaultIfEmpty()
select new { c.CompanyID, types.ProductTypeID, b.ProductBrandID, accreds.AccreditationID, s.AnimalName }).Distinct();
我试图实现以下T-SQL查询:
SELECT DISTINCT c.CompanyID, b.ProductBrandID, s.AnimalName, a.AccreditationID, t.ProductTypeID
FROM dbo.ProductBrand b
INNER JOIN dbo.BrandManufacturer bm ON b.ProductBrandID = bm.ProductBrandID
INNER JOIN dbo.Company c ON bm.ProductManufacturerID = c.CompanyID
INNER JOIN dbo.AnimalSource s ON b.AnimalCode = s.AnimalCode
LEFT OUTER JOIN dbo.BrandAccreditation ba ON b.ProductBrandID = ba.ProductBrandID
LEFT OUTER JOIN dbo.Accreditation a ON ba.AccreditationID = a.AccreditationID
LEFT OUTER JOIN dbo.BrandType bt ON b.ProductBrandID = bt.ProductBrandID
LEFT OUTER JOIN dbo.ProductType t ON bt.ProductTypeID = t.ProductTypeID;
空值是AccreditationID列中的。以下是关系:
我的问题实际上分为两部分:
感谢。
答案 0 :(得分:4)
(1)我是否正确地将我的T-SQL查询翻译成LINQ?
是的,你做得对。
附注(与主要问题无关):执行left outer join
时无需使用不同的名称。使用into
子句后,用于访问实体记录的名称超出范围且可以重复使用,这使得查询的其余部分看起来类似,无论连接类型如何inner
或{{ 1}})。例如
left outer
可能是
join ba in Program.db.BrandAccreditations on b.ProductBrandID equals ba.ProductBrandID into bax
from credJoins in bax.DefaultIfEmpty()
如果您移除join ba in Program.db.BrandAccreditations on b.ProductBrandID equals ba.ProductBrandID into baJoin
from ba in baJoin.DefaultIfEmpty()
和以下into
行,则会from
,反之亦然。
(2)当事实上期望空值(因此左外连接)时,如何解决与空值相关的问题?
这是inner join
和值类型字段的典型错误。实际上,完整的错误消息包含解决方案:
结果类型的通用参数或查询必须使用可空类型。
换句话说,找到来自left join
的{{1}}一侧的非可空值类型字段,然后将它们转换为可以为空的等效字段。
在你的情况下,在这里:
right
此类字段为left outer join
和select new { c.CompanyID, types.ProductTypeID, b.ProductBrandID, accreds.AccreditationID, s.AnimalName }
,因此修复方法是(假设它们的类型为types.ProductTypeID
):
accreds.AccreditationID