2013-01-19 20 views
0

我是EFLINQ中的新问题,我面临一个奇怪的问题。当我检查我的select new块中的空值时,子表中的所有值都将为空。以下是LINQ查询。通过可视化LINQ加入问题,返回所有空值

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工作台跑上面的SQL我得到了下面的输出(repalcing @linq_0与用户ID)

我的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。

workbench output

我父表结构 tblPackageDetails

子表结构 tblPackageSelected

输出我想 Output wanted

但对于IsCompleteIsActiveUserIDPackageSelectedIDIsSelected null作为结果状态在select new块检查分配假或0

如果删除空检查的值,我得到第一3行和在第四值迭代我得到异常。 The cast to value type 'Boolean' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type

请帮... :(

工作代码块

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

由于2Kay :)

回答

2

tjnull,EF consieders为TJ的所有属性null。没关系,但是当EF试图将它们物化为价值类型时,它就失败了。因此,解决方案是使用可空类型..

尝试此查询:

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 
    }; 
+0

这并没有帮助,得到了异常,说明'演员到值类型“布尔”失败,因为物化值为null。结果类型的泛型参数或查询必须使用可为空的类型。“任何其他建议? –

+0

@RAJ K,勾选编辑。现在它包含一个qeury给你想要的输出.. – 2kay

+0

谢谢,它的工作。仅供参考,我不得不修改我的'foreach'块来处理空值。我会发布该块,这也会帮助其他人。 –