LINQ select 语句之后的强类型新对象

本文关键字:对象 新对象 强类型 select 语句 之后 LINQ | 更新日期: 2023-09-27 17:57:06

这对我来说不是一个关键的概念,但我只是想知道我是否可以在语句后强键入一个新对象linq select而不是使其成为匿名类型,C#.这是一个示例,当然已不存在,但说明了这个概念:

public class DisplayAddress { public int AddressId; public string ShortAddress; }
List<DisplayAddress> shortAddresses = 
  (from la in longAddresses
    join ca in customerAddresses
      on la.AddressId equals ca.AddressId
    where ca.CustomerId == selectedCustomer
  select new { new DisplayAddress() {AddressId = la.AddressId, ShortAddress = la.Line1 + " " + la.City + " " + la.State}}).Tolist<DisplayAddress>();

LINQ select 语句之后的强类型新对象

当然,您可以在Select中使用任何表达式,包括创建您定义的类型的新对象的表达式。您需要做的就是移除外部new

select new DisplayAddress {
    AddressId = la.AddressId
,   ShortAddress = la.Line1 + " " + la.City + " " + la.State
}).Tolist();

请注意,匿名类型也是强类型的。换句话说,如果你这样做

select new {
    AddressId = la.AddressId
,   ShortAddress = la.Line1 + " " + la.City + " " + la.State
}).Tolist();

您的匿名类型将有两个强类型字段,分别称为 AddressIdShortAddress 。唯一的区别是,您需要在创建匿名对象的上下文中使用匿名对象,以保留强类型。换句话说,如果不使用 dynamicobject 等,您将无法将匿名Select的结果传递给非泛型函数。

您的示例代码非常接近。你把一些事情过于复杂化,这可能是你的失败。

在您的select子句中,与其定义new { new DisplayAddress() ... }不如new DisplayAddress() .(你实际上是在把你的DisplayAddress装在另一个不必要的对象中。还有一个编译器错误,即未定义该属性的成员名称是什么。

在查询结束时,您正在执行Tolist<DisplayAddress>()。几个问题:

  • 该方法在 C# 中ToList()和大写很重要。 :)
  • 由于您在Tolist<DisplayAddress>()调用中指定了DisplayAddress,因此会导致编译器错误,因为无法将匿名类型转换为强DisplayAddress类型。

解决所有这些小问题后,您会提出以下问题:

var shortAddresses = (from la in longAddresses
                      join ca in customerAddresses
                        on la.AddressId equals ca.AddressId
                      where ca.CustomerId == selectedCustomer
                      select new DisplayAddress() 
                      { 
                        AddressId = la.AddressId, 
                        ShortAddress = la.Line1 + " " + la.City + " " + la.State
                      }).ToList();