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

时间:2016-07-15 20:48:34

标签: c# linq

这对我来说不是一个关键概念,但我只是 想知道我是否可以在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>();

2 个答案:

答案 0 :(得分:4)

当然,您可以使用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的强类型字段。唯一的区别是您需要在创建它们的上下文中使用匿名对象,以保持强类型。换句话说,如果不使用Selectdynamic等,您将无法将匿名object的结果传递给非通用函数。

答案 1 :(得分:1)

您的示例代码真的关闭。你过度复杂了一些可能是你垮台的事情。

select条款中,而不是定义new { new DisplayAddress() ... }只做new DisplayAddress()。 (你有效地将你的DisplayAddress装入了另一个不必要的对象。还有一个编译器错误,即没有定义该属性的成员名称是什么。)

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

  • 方法是ToList(),大写字母在C#中很重要。 :)
  • 由于您在DisplayAddress调用中指定了Tolist<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();