2013-01-19 41 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'塊來處理空值。我會發布該塊,這也會幫助其他人。 –