这对我来说不是一个关键的概念,但我只是想知道我是否可以在语句后强键入一个新对象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>();
当然,您可以在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();
您的匿名类型将有两个强类型字段,分别称为 AddressId
和 ShortAddress
。唯一的区别是,您需要在创建匿名对象的上下文中使用匿名对象,以保留强类型。换句话说,如果不使用 dynamic
、object
等,您将无法将匿名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();