2016-09-13 144 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