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
块来处理空值。我会张贴这一块,这将有助于其他人也。