选择新类型时 - 无法在LINQ to Entities查询

时间:2015-05-16 07:00:47

标签: c# linq entity-framework linq-to-sql linq-to-entities

当我调用此linq查询时,我收到以下错误:
无法在LINQ to Entities查询中构造实体或复杂类型“DataModel.CustomerContact”。

我不明白我在这里做错了什么。通常,当我没有加入任何其他表并且没有导航属性时,我通常只选择cc,但在这种情况下,我需要创建一个新的CustomerContact对象,以便我可以绑定导航属性。

我对此做了一些研究,是否真的没办法做到这一点?如果我使用匿名类型,我如何转换为CustomerContact,因为我需要最终将CustomerContact列表返回给我的应用程序?如果我只选择cc,那么cc.CustomerName将不会被设置。我真的想避免在我能够使用自动生成的EF对象类时创建Dtos。

public static IEnumerable<CustomerContacts> GetList(int customerId = null)
{
  using (var context = new AppContext())
  {
    var cList = (from cc in context.CustomerContacts
                   join c in context.Customers on cc.CustomerId equals c.Id
                   where (customerId == null || cc.CustomerId == customerId)
                   select new CustomerContact
                   {
                       Id = cc.Id,
                       FirstName = cc.FirstName,
                       LastName = cc.LastName,
                       Email = cc.Email,

                       // navigation properties
                       CustomerName = c.Name
                   }).ToList();
    return objList;
  }
}

1 个答案:

答案 0 :(得分:0)

  

如果我只选择cc,那么cc.CustomerName将不会被设置

你可以这样做:

from cc in context.CustomerContacts.Include(cc => cc.CustomerName)

...为您自动加载导航属性。搜索“EF导航属性延迟加载”。

注意,你需要'使用一些我不记得的命名空间'来使用该语法,因为它使用扩展方法。否则,您只需引用要加载的导航属性的名称,如:

from cc in context.CustomerContacts.Include("CustomerName")