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