2016-11-18 59 views
0

我想修改LINQ查询,选择一些属性到一个数组,但我在努力实现它的一部分。LINQ选择到阵列

toRun.AddRange(entity.Properties 
     .Select(property => property.PrimaryField) 
     .Select(field => new { field, entity = entity.EntityName, table = field.Table, key = entity.EntityIdField }) 

我需要这个修改,这样如果第二个名为SecondaryField的属性不是null或空字符串,它将被添加到第一个Select语句的结果中。

例如,如果entity.Properties包含:

Property { PrimaryField = "a", SecondaryField = "b" }, 
    Property { PrimaryField = "c", SecondaryField = "" } 

我想第一个SELECT语句返回:

{ "a", "b", "c" } 

得到任何帮助的感谢。

+0

所以,你希望所有PrimaryFields的列表,而不是空或空所有SecondaryFields? – bixarrio

+3

无论你的标题和你的问题不清楚的,我实在不明白的代码块和输出之间的关系,但你要找的东西像'.SelectMany(P =>新的[] {p.PrimaryField,P .SecondaryField)。凡(p =>!string.IsNullOrWhitespace(p))'? – CodeCaster

+0

@CodeCaster这就是我的想法。 –

回答

2

这似乎重现你想:你有两个属性的类:

public class Foo 
{ 
    public string Bar { get; set; } 
    public string Baz { get; set; } 
} 

其中有一个集合:

var foos = new List<Foo> 
{ 
    new Foo { Bar = "a", Baz = "b" }, 
    new Foo { Bar = "c", Baz = "" }, 
}; 

并从此集合中,您要选择所有具有非空值的属性到数组中。

你可以这样做使用SelectMany()

var result = foos.SelectMany(f => new[] { f.Bar, f.Baz }) 
       .Where(p => !string.IsNullOrWhiteSpace(p)) 
       .ToArray(); 

您选择包含两个属性的值的新数组,然后过滤掉不想要的值,然后再打开,结果到一个数组。

+0

非常完美的感谢 –

1

这应该是很简单 - 让这两个领域,使用Where删除空/空箱并打开到一个数组:

var result = entity.Properties.SelectMany(p =>new[]{ p.PrimaryField,p.SecondaryField}) 
      .Where(x => !String.IsNullOrEmpty(x)) 
      .ToArray(); 

活生生的例子:http://rextester.com/MHM61977