2017-06-20 170 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();