2015-08-08 53 views
1

我有一个实体有一个字段,我不想有时返回。实体框架,获取实体的一部分

我现在将它设置为null。有没有一种方法可以在查询本身中指定它,而不是像我在这里那样清除它?

public async Task<IQueryable<XYZXY>> GetStuff() 
    { 
      histories = 
       _db.Stuffs 
        .Where(n => n.NationId == User.NationId) 
        .OrderBy(x => x.DateSent); 
      await histories.ForEachAsync(d => d.Attachment = null); 
      return histories; 

    } 
+2

为什么不只是在查询中选择感兴趣的列? – trashr0x

+0

这一切都取决于'Attachment'是什么,以及你需要排除它的原因。导航属性和更多可以改变你如何做到这一点,而无需创建新的对象。 – Eris

+0

使用*表分割*。 –

回答

1

你在找什么叫做投影,这是你想从服务器投影到你的结果集中的东西。

在EF投影中,您的查询的选择行与您所做的任何包含的组合完成。

如果附件是导航属性访问的第二个表,它不会被当前查询返回(IE将为空),除非您进行延迟加载(通常由nav属性上的virtual关键字表示,例如public virtual Attachment Attachment {get;set;}) 。如果附件一列投影是更复杂

你有2个选择,使用annonomous类型如:

_db.Stuffs 
    .Where(n => n.NationId == User.NationId) 
    .OrderBy(x => x.DateSent) 
    .Select(x=> new { A = x.A, B = x.B .... /*Dont list attachment*/}); 

或重用现有对象

_db.Stuffs 
    .Where(n => n.NationId == User.NationId) 
    .OrderBy(x => x.DateSent) 
    .Select(x=> new Stuff { A = x.A, B = x.B .... /*Dont list attachment*/}); 

待办事项自定义投影不会跟踪如此改变一个属性和调用保存不会工作。