EF4如何在LINQ中将匿名类型转换为强类型?

6
LINQ代码返回了一个匿名类型,如何返回一个强类型的“Customers”? 我返回一个匿名类型,因为我只想从实体中选择特定的字段。
var customer = from c in _entities.Customers
                           join con
                           in _entities.Contracts on c.CustomerID equals con.customerID
                           where con.contractNo == number
                           select new
                           {
                               Surname = c.Surname,
                               Forename= c.Forename,
                               Address = c.Address,
                               Suburb = c.Suburb,
                               State = c.State,
                               Postcode = c.PostCode,
                               PhoneNo = c.PhoneNo
                       };

谢谢


1
你应该尽量接受一些你的答案,否则人们将来会不愿意帮助你。 - eandersson
2个回答

6

无论如何

var customer = from c in _entities.Customers
                       join con
                       in _entities.Contracts on c.CustomerID equals con.customerID
                       where con.contractNo == number
                       select c;

选择具有现状或历史的客户实例。
Customer customer = (from c in _entities.Customers
                       join con
                       in _entities.Contracts on c.CustomerID equals con.customerID
                       where con.contractNo == number
                       select new Customer{
                           Surname = c.Surname,
                           Forename= c.Forename,
                           Address = c.Address,
                           Suburb = c.Suburb,
                           State = c.State,
                           Postcode = c.PostCode,
                           PhoneNo = c.PhoneNo
                       }).FirstOrDefault();

如果提供的顾客类具有无参构造函数,您可以仅填写感兴趣的属性来创建新的顾客实例。


我使用了第二个LINQ查询,但是如何将var customer转换为Customer?我只想返回一行。 - mark s
请根据需要使用.SingleOrDefault().FirstOrDefault() - Bala R
我在“Select”新客户时遇到了一个错误。“无法隐式转换类型system.linq.IQueryable<Portal.Model.Customer>为Portal.Model.Customer。显式转换存在(是否缺少转换)。由于我正在创建新客户,我需要一个转换吗? - mark s
@Marks 请查看我的修改,我已经在查询中包含了 FirstOrDefault()。如果每次都只会有零个或一个结果,那么将其更改为 SingleOrDefault() - Bala R
代码编译成功了,但是出现了一个错误:在 LINQ to Entities 查询中无法构造实体或复杂类型 'PortalModel.Customers'。 - mark s
@marks:这是因为在Linq to Entities中无法将投影到实体 - 您应该使用导航属性而不是连接,或者如果必须使用第一个示例。 - BrokenGlass

2

看起来你想查找所有与匹配 number contractNo 有任何合同的客户 - 不要使用连接,而是使用EF导航属性:

var customers = _entities.Customers
                         .Where( c => c.Contracts.Any( x => x.contractNo == number));

如果只有一个(或者可能没有)这些客户,使用SingleOrDefault()来仅检索单个Customer实体:
Customer customer = _entities.Customers
                             .Where( c => c.Contracts.Any( x => x.contractNo == number))
                             .SingleOrDefault();

我将研究EF导航属性。如何将var客户转换为Customer? - mark s
1
@user730381:这是一个客户 - 在第二个示例中,您可以交替使用 var customer = ...Customer customer = ... - BrokenGlass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接