【问题标题】:LINQ How to select more than 1 property in a lambda expression?LINQ 如何在 lambda 表达式中选择多个属性?
【发布时间】:2010-12-03 14:22:32
【问题描述】:

我们经常使用下面的 lambda 表达式

MyList.Select(x => x.Id).ToList();

是否可以使用 lambda 表达式获得超过 1 个属性?例如来自 MyList 的 IdName

我知道我可以使用以下语法:

(from item in MyList
 select new { item.Id, item.Name }).ToList();

我可以使用 lambda 表达式做同样的事情吗?

【问题讨论】:

  • 其实这是 lambda 表达式:new { item.Id, item.Name }

标签: c# linq lambda anonymous-types


【解决方案1】:
MyList.Select(x => new { x.Id, x.Name }).ToList();

【讨论】:

  • 嗯,但是然后从 Object 包中投射该列表,例如 Session ?
  • @Tony,在这种情况下,Select 返回一个匿名类型,就像查询表达式版本的情况一样。如果您需要将结果塞入并在以后重用或传递它,那么您应该继续在代码中定义一个具体类型。
  • @Tony,一旦定义了该类型,您只需将选择更改为Select(x => new YourNewType { x.Id, x.Name })
  • 为了解决@CodeInChaos 的观点,如果关注不变性,只需通过适当的构造函数传入参数即可。 Select(x => new YourNewType(x.Id, x.Name)) 然后,当然,定义类的属性/字段,使对象在构造后不可变。
  • 那么,如何传递不同的模型,该模型仅用于将数据作为自定义模型传递。该模型是预定义的,例如 public classAPIDepartment { public int DepartmentID { get; set; } public string DepartmentTitle { get; set; } IEnumerable<Employee> Employees { get; set; } } 我如何通过这个模型发送?我失败了,使用 lambda 表达式。我试过IEnumerable<APIDepartment> employees=_db.Departments.Where(d=> d.DepartmentTitle.Contains(partialDept)).Select(x=>new APIDepartment(){x.DepartmentTitle, x.DepartmentID}).AsEnumerable();
【解决方案2】:

您感兴趣的功能是 C# 3 的 Anonymous Types

你可以创建一个匿名类型的新实例:

var v = new { Amount = 108, Message = "Hello", this.Text };

当然,这也可以作为 lamda:

SomeThing.Select( () => new {X=1,Y=2} )

代码中的任何位置。它还获取属性名称,在这种情况下您不需要显式指定它(在我的示例中,匿名类型的第三个成员自动命名为 Text

很遗憾,您不能将它们用作函数的非通用返回类型。

【讨论】:

    【解决方案3】:
    var sample = dbcontext.MyList
                          .Select(m => new Mylist{ sampleid=m.sampleid,item=m.item })
                          .ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      相关资源
      最近更新 更多