2017-02-13 118 views
1

我正在循环访问公司列表,并通过使用以下linq查询来检索我想要的数据来创建一个匿名对象。LINQ匿名对象选择属性如果不为空

查询是如下:

var customMail = this.db.Companies.Where(c => c.Id == company.Id) 
            .Select(x => new { x.FromMail, x.FromName, x.Subject, x.EmailBody }) 

这个目的是正确地填充作为一个列表与包含正确的细节一个结果。但有时一个字段包含一个null如何过滤掉那些空值?

我已经尝试没有成功如下:

var customMail = this.db.Companies.Where(c => c.Id == company.Id) 
            .Select(x => new { x.FromMail, x.FromName, x.Subject, x.EmailBody }) 
            .Select(a => a.GetType().GetProperties() 
                .Where(pi => pi.GetValue(a) != null) 
                .Select(pi => pi.GetValue(a))); 

我很想得到的对象,而空值,然后在方法中使用它的值。

+0

你为什么使用反射?你可以检查每个属性在哪里 –

+0

由于它是一个匿名对象,道具不可用@EhsanSajjad – Baklap4

回答

2

如果你想过滤掉其他属性设置为null对象,你可以做这样的:

var customMail = this.db.Companies.Where(c => c.Id == company.Id) 
    .Select(x => new { x.FromMail, x.FromName, x.Subject, x.EmailBody }) 
    .AsEnumerable() // Now you can use reflection 
    .Where(
     a => a.GetType().GetProperties().All(pi => pi.GetValue(a) != null) 
    ); 

这将产生与设置为非空的所有属性的匿名对象的列表值。

+0

或者你可以在Select之前手动检查这些属性,其中只有4个。 – Evk

+0

@dasblinkenlight你不需要'.AsEnumerable()',**。Select()**已经返回一个 – Innat3

+1

AsEnumerable失踪了,谢谢!同时我已经修复了它,而不必使用反射。我正在考虑离开哈哈。但很好,它是可行的! – Baklap4