LINQ连接问题,返回所有空值
我是LINQ连接问题,返回所有空值,linq,entity-framework,c#-4.0,Linq,Entity Framework,C# 4.0,我是EF和LINQ的新手,我面临着一个奇怪的问题。当我在我的selectnew块中检查null值时,子表中的所有值都将为null。下面是LINQ查询 我的Linq代码 var linqResult = from pd in entities.tblpackagedetails join ps in entities.tblpackageselecteds on pd.PackageDetailsID equals ps.PackageDetailsID
EF
和LINQ
的新手,我面临着一个奇怪的问题。当我在我的selectnew
块中检查null值时,子表中的所有值都将为null。下面是LINQ
查询
我的Linq代码
var linqResult = from pd in entities.tblpackagedetails
join ps in entities.tblpackageselecteds
on pd.PackageDetailsID equals ps.PackageDetailsID
into tabJoin
from tj in tabJoin.Where(ps => ps.UserID == userID
&& ps.IsActive == true).DefaultIfEmpty()
select new
{
IsComplete = (tj == null) ? false : tj.IsComplete,
IsActive = (tj == null) ? false : tj.IsActive,
UserID = (tj == null) ? 0 : tj.UserID,
IsMandatory = pd.IsMandatory,
PackageSelectedID = (tj == null) ? 0 : tj.PackageSelectedID,
IsSelected = (tj == null ? false : tj.IsSelected),
pd.Amount,
pd.Code,
pd.Description,
pd.Points,
pd.PackageDetailsID
};
foreach (var result in linqResult)
{
packagesSelected.Add(new PackageDetailDataModel()
{
Amount = result.Amount,
Code = result.Code,
Description = result.Description,
IsComplete = result.IsComplete,
IsMandatory = result.IsMandatory,
PackageDetailsID = result.PackageDetailsID,
PackageSelectedID = result.PackageSelectedID,
Points = result.Points,
IsActive = result.IsActive,
UserID = result.UserID,
IsSelected = result.IsSelected
});
}
可视化工具生成的SQL
SELECT
`Extent1`.`PackageDetailsID`,
`Extent2`.`IsComplete`,
`Extent2`.`IsActive`,
`Extent2`.`UserID`,
`Extent1`.`IsMandatory`,
`Extent2`.`PackageSelectedID`,
`Extent2`.`IsSelected`,
`Extent1`.`Amount`,
`Extent1`.`Code`,
`Extent1`.`Description`,
`Extent1`.`Points`
FROM `tblpackagedetails` AS `Extent1`
LEFT OUTER JOIN `tblpackageselected` AS `Extent2`
ON (`Extent1`.`PackageDetailsID` = `Extent2`.`PackageDetailsID`)
AND ((`Extent2`.`UserID` = @linq_0) AND (1 = `Extent2`.`IsActive`))
当我在MySQL workbench中运行上述sql时,我得到了以下输出(使用userID重新分解@linq_0
)
我的父表结构
子表结构
我想要的输出
但是,的值是complete
,是active
,UserID
,PackageSelectedID
和是selected
null,作为在选择新的
块分配false或0中检查的结果条件
若我删除空检查,我会得到前3行的值,在第四次迭代中,我会得到下面的异常。
转换为值类型“Boolean”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型
请帮忙(
工作代码块
packagesSelected = new List<PackageDetailDataModel>();
var linqResult = from pd in entities.tblpackagedetails
join ps in entities.tblpackageselecteds
on pd.PackageDetailsID equals ps.PackageDetailsID
into tabJoin
from tj in tabJoin.Where(ps => ps.UserID == userID
&& ps.IsActive == true).DefaultIfEmpty()
select new
{
IsComplete = (bool?)tj.IsComplete,
IsActive = (bool?)tj.IsActive,
UserID = (int?)tj.UserID,
IsMandatory = pd.IsMandatory,
PackageSelectedID = (int?)tj.PackageSelectedID,
IsSelected = (bool?)tj.IsSelected,
pd.Amount,
pd.Code,
pd.Description,
pd.Points,
pd.PackageDetailsID
};
foreach (var result in linqResult)
{
packagesSelected.Add(new PackageDetailDataModel()
{
Amount = result.Amount,
Code = result.Code,
Description = result.Description,
IsComplete = (result.IsComplete ?? false),
IsMandatory = result.IsMandatory,
PackageDetailsID = result.PackageDetailsID,
PackageSelectedID = (result.PackageSelectedID ?? 0),
Points = result.Points,
IsActive = (result.IsActive ?? false),
UserID = (result.UserID ?? 0),
IsSelected = (result.IsSelected ?? false)
});
}
packagesSelected=新列表();
var linqResult=来自entities.tblpackagedetails中的pd
在entities.tblpackageselecteds中加入ps
在pd.PackageDetailsID上等于ps.PackageDetailsID
加入tabJoin
从tabJoin.Where中的tj(ps=>ps.UserID==UserID
&&ps.IsActive==true.DefaultIfEmpty()
选择新的
{
IsComplete=(bool?)tj.IsComplete,
IsActive=(bool?)tj.IsActive,
UserID=(int?)tj.UserID,
IsMandatory=pd.IsMandatory,
PackageSelectedID=(int?)tj.PackageSelectedID,
IsSelected=(bool?)tj.IsSelected,
pd.金额,
pd.代码,
pd.说明,
pd.Points,
pd.PackageDetailsID
};
foreach(linqResult中的var结果)
{
PackageSelected.Add(新PackageDetailDataModel()
{
金额=结果。金额,
代码=结果。代码,
Description=结果。Description,
IsComplete=(result.IsComplete??false),
IsMandatory=结果。IsMandatory,
PackageDetailsID=result.PackageDetailsID,
PackageSelectedID=(result.PackageSelectedID±0),
点=结果。点,
IsActive=(result.IsActive??false),
UserID=(result.UserID±0),
IsSelected=(result.IsSelected??false)
});
}
由于:)当
tj
为null
时,EF将tj的所有属性视为null
。这没关系,但当EF试图将它们具体化为值类型时,它失败了。因此,解决方案是使用可为null的类型
请尝试以下查询:
var linqResult = from pd in entities.tblpackagedetails
join ps in entities.tblpackageselecteds
on pd.PackageDetailsID equals ps.PackageDetailsID
into tabJoin
from tj in tabJoin.Where(ps => ps.UserID == userID
&& ps.IsActive == true).DefaultIfEmpty()
select new
{
IsComplete = (bool?) tj.IsComplete,
IsActive = (bool?) tj.IsActive,
UserID = (int?) tj.UserID,
IsMandatory = pd.IsMandatory,
PackageSelectedID = (int?) tj.PackageSelectedID,
IsSelected = (bool?) tj.IsSelected,
pd.Amount,
pd.Code,
pd.Description,
pd.Points,
pd.PackageDetailsID
};
这没有帮助,得到异常,声明
转换为值类型“Boolean”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型。
还有其他建议吗???谢谢,可以使用了。仅供参考,我必须修改我的foreach
块来处理空值。我会张贴这一块,这将有助于其他人也。