2017-06-20 152 views
3

我們正處於一個困難時期試圖找出與出聲明一個循環,你會得到數據後處理的最佳方式時,處理空巢狀值。使用LAMBDA。選擇()與實體框架

例如採取這段代碼:(數據2被綁定到數據與外鍵)

context.Data.Select(_ => new DataModel 
        { 
         Id = _.Id, 
         Data2 = new Data2Model 
         { 
          Id = _.Data2.Id, 
          Name = _.Data2.Name, 
          Date = _.Data2.Date 
         }, 
         Date = _.Date           
        }); 

如果_.Data2不是null,則此運行正常,但如果_.Data2恰好是空那麼這將會出錯。我們現在正在解決這個問題的方式是將Data2Id添加到我們的DataModel,然後遍歷所有記錄以獲取信息(如果它不爲null)。

var lst = context.Data.Select(_ => new DataModel 
          { 
           Id = _.Id, 
           Data2Id = _.Data2ID 
           Date = _.Date           
           }).ToList(); 

foreach(var item in lst) 
{ 
    if (item.Data2Id != null) 
    { 
     var dataItem = context.Data2.FirstOrDefault(_ => _.Id == item.Data2Id); 
     item.Data2 = new Data2Model 
     { 
      Id = dataItem.Id, 
      Name = dataItem.Name, 
      Date = dataItem.Date 
     } 
     } 
} 

是否有一個更清潔/更好的方法來保持原來的選擇循環。

感謝

回答

3

嘗試:

Data2 = _.Data2 == null ? null : new Data2Model 
{ 
    Id = _.Data2.Id, 
    Name = _.Data2.Name, 
    Date = _.Data2.Date 
}, 
+0

試試?它工作還是不工作? :) –

+0

它應該:)我沒有完整的類定義,我不知道結果是否可以接受。 –

+0

這工作就像一個魅力。空值返回null,如果他們有數據,則它們作爲新模型返回。謝謝! – NormTheThird

1

您可以提取邏輯在不同的方法來縮短您的LINQ查詢和潛在的重用代碼:

private static DataModel Map(DataModel _) 
{ 
    Data2Model model = _.Data2 ?? new Data2Model(); 
    return new DataModel 
    { 
     Id = _.Id, 
     Date = _.Date, 
     Data2 = new Data2Model 
     { 
      Id = model.Id, 
      Name = model.Name, 
      Date = model.Date 
     } 
    }; 
} 

你的查詢比變爲:

context.Data.Select(Map); 

此時應更換用你自己的人造類型。

+0

虐待看看這個方法的感謝。但是帕布羅的答案解決了我們的問題。 – NormTheThird

1
context.Data.Select(_ => new DataModel 
        { 
         Id = _.Id, 
         Data2 = _.Data2 == null ? 
         new Data2Model{Id = _.Data2ID} : 
         new Data2Model{ Id=_.Data2.Id, Name=_.Data2.Name, Data=_.Data2.Date},  
         Date = _.Date           
        }); 

我正在做的假設,如果它是空你還有_.Data2ID在手?

使用ternary operator

如果數據2是null則只有其他_.Data2ID值返回一個新的Data2Model

如果不是null然後繼續前進,創造一個新的Data2Model的所有細節。

0

你實際上是在尋找一個左連接,我會在這裏利用表達式的功能:

var data2Collection = from d2 in context.Data2 
         select new 
         Data2Model 
         { 
          Id = d2.Id, 
          Name = d2.Name, 
          Date = d2.Date 
         }; 

var lst = (from d1 in context.Data 
      join d2 in data2Collection on d1.Data2Id equals d2.Id into leftJoin 
      from d2 in leftJoin.DefaultIfEmpty() 
      select new DataModel 
      { 
       Id = d1.Id, 
       Data2 = d2, 
       Date = d1.Date 
      }).ToList();