2016-09-13 106 views
4

是否可以在LINQ Select中包含或排除列?LINQ SELECT中的IF语句包含列

var numberOfYears = Common.Tool.NumberOfYear; 
var list = users.Select(item => new 
     { 
      Id = item.Id, 
      Name= item.Name, 
      City= Item.Address.City.Name, 
      STATUS = Item.Status, 
      if(numberOfYears == 1) 
      { 
       Y1 = item.Records.Y1, 
      } 
      if(numberOfYears == 2) 
      { 
       Y1 = item.Records.Y1, 
       Y2 = item.Records.Y2, 
      } 
      if(numberOfYears == 3) 
      { 
       Y1 = item.Records.Y1, 
       Y2 = item.Records.Y2, 
       Y3 = item.Records.Y3, 
      } 
     }).ToList(); 
    } 

的想法是,我想显示Y1,Y2,Y3只要有值

+1

您可以对每个属性使用三元运算符。产生的对象必须是相同的,所以每个对象都必须具有3个'Yx'属性。只需使用一些默认值或“null”值。 – kiziu

+0

如果你不介意使用[Dynamic Linq](http://stackoverflow.com/questions/16516971/linq-dynamic-select) –

+0

你可能会如何使用'list'变量? –

回答

2

得益于dynamic关键字你所需要的,现在可以在C#中的美。下面是一个例子:

public class MyItem 
{ 
    public string Name { get; set; } 
    public int Id { get; set; } 
} 

static void Main(string[] args) 
{ 
    List<MyItem> items = new List<MyItem> 
    { 
     new MyItem 
     { 
      Name ="A", 
      Id = 1, 
     }, 
     new MyItem 
     { 
      Name = "B", 
      Id = 2, 
     } 
    }; 

    var dynamicItems = items.Select(x => { 
     dynamic myValue; 
     if (x.Id % 2 == 0) 
      myValue = new { Name = x.Name }; 
     else 
      myValue = new { Name = x.Name, Id = x.Id }; 

     return myValue; 
    }).ToList(); 
} 

这将返回一个动态对象列表。一个拥有一个属性,另一个拥有两个属性。

1

试试这个办法:

var numberOfYears = Common.Tool.NumberOfYear; 
var list = users.Select(item => new 
    { 
     Id = item.Id, 
     Name = item.Name, 
     City = Item.Address.City.Name, 
     STATUS = Item.Status, 
     Y1 = numberOfYears > 0 ? item.Records.Y1 : 0, 
     Y2 = numberOfYears > 1 ? item.Records.Y2 : 0, 
     Y3 = numberOfYears > 2 ? item.Records.Y3 : 0 
    }).ToList(); 

而不是0,加上您的默认值或null

更新: 根据您的意见,唯一的选择是你的动态。这里的例子有动态:

var numberOfYears = 3; 
var list = users.Select(x => 
{ 
    dynamic item = new ExpandoObject(); 
    item.Id = x.Id; 
    item.Name = x.Name; 
    item.Status = x.Status; 

    var p = item as IDictionary<string, object>; 
    var recordsType = x.Records.GetType(); 
    for (var i = 1; i <= numberOfYears; ++i) 
     p["Y" + i] = recordsType.GetProperty("Y" + i).GetValue(x.Records); 

    return item; 
}).ToList(); 
+0

即使输入为0,该解决方案也会显示该列。想法是,如果输入的numberOfYears = 0,则不应显示任何列。 – Maro

+0

年数也可以达到12, – Maro