【问题标题】:IF statement inside a LINQ SELECT to include columnsLINQ SELECT 中的 IF 语句以包含列
【发布时间】:2017-01-21 05:30:57
【问题描述】:

是否可以在 linq Select 中包含或排除列?

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 是否有值

【问题讨论】:

  • 您可以对每个属性使用三元运算符。结果对象必须相同,因此每个对象都必须具有 3 个 Yx 属性。只需为它们使用一些默认值或null 值。
  • 如果你不介意使用Dynamic Linq是可能的
  • 你将如何使用list 变量?
  • 为什么不使用 .Where(x => ...) ?
  • 用户输入的年数和模型之间没有联系。它基本上是获取历史记录,用户可以选择时间段。也许设计很糟糕,但我不能改变它,所以我必须照原样接受。

标签: c# linq select dynamic properties


【解决方案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();

添加默认值或null,而不是 0。

更新: 根据您的 cmets,您唯一的选择是动态化。以下是动态示例:

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,此解决方案也会显示该列。其想法是,如果 numberOfYears = 0 的输入,则不应显示任何列。
  • 年数也可以达到 12 ,
【解决方案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 个属性,一个有 2 个属性。

【讨论】:

    【解决方案3】:

    您可以像这样使用ExpandoObject

    var data = providers.Select(provider =>
    {
        dynamic excelRow = new ExpandoObject();
    
        excelRow.FirstName = provider.FirstName ?? "";
        excelRow.MiddleName = provider.MiddleName ?? "";
        excelRow.LastName = provider.LastName ?? "";
        
        // Conditionally add columns to the object...
        if (someCondition)
        {
            excelRow.Property1ForCondition = provider.Property1ForCondition;
            excelRow.Property2ForCondition = provider.Property2ForCondition;
        }
    
        excelRow.DueDate = provider.DueDate ?? null;
    
        .
        .
        .
    
        return excelRow;
    });
    

    上述代码的另一种变体可以是:

    var data = new List<ExpandoObject>();
    
    providers.ForEach(provider =>
    {
        dynamic excelRow = new ExpandoObject();
    
        excelRow.FirstName = provider.FirstName ?? "";
        excelRow.MiddleName = provider.MiddleName ?? "";
        excelRow.LastName = provider.LastName ?? "";
        
        // Conditionally add columns to the object...
        if (someCondition)
        {
            excelRow.Property1ForCondition = provider.Property1ForCondition;
            excelRow.Property2ForCondition = provider.Property2ForCondition;
        }
    
        excelRow.DueDate = provider.DueDate ?? null;
    
        .
        .
        .
    
        data.Add(excelRow);
    });
    

    【讨论】:

      猜你喜欢
      • 2013-10-18
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 2017-02-23
      • 2011-08-18
      • 2013-02-22
      相关资源
      最近更新 更多