在LINQ to Entities查询的SELECT中添加第二个查询会出现Not Recognized Method错误

时间:2015-09-13 00:19:54

标签: c# entity-framework linq asp.net-mvc-5.2

我已经构建了一个LINQ查询来填充我的ViewModel之一的数据,但在.SELECT()方法中我尝试添加另一个查询来填充其中一个VM的属性。当我运行页面时出现错误:

  

LINQ to Entities无法识别方法'System.Linq.IQueryable 1[FFInfo.DAL.Location] Include[Location](System.Linq.IQueryable 1 [FFInfo.DAL.Location],System.String)'方法,并且此方法无法转换为商店表达式。< / p>

我使用第二个查询的原因是因为LocationTransitionPoints确实直接链接到Locations(通过ToLoationFromLocation),但它没有直接链接到{{ 1}}我不知道如何努力(LocationTranitionPoints - &gt; Locations - &gt; Section)

我有一种感觉我只是错过了一些愚蠢的小东西,但不能把手指放在上面,有什么建议吗?

Section

2 个答案:

答案 0 :(得分:1)

你能做这样的事吗?

var model = db.LocationTransitionPoints
  .Select(ltp => new TransitionPointsVM()
  {
      FromLocation = ltp.FromLocation.Name,
      ID = ltp.ID,
      // get to Section through ToLocation
      SectionTitle = ltp.ToLocation.Section.Title,
      ToLocation = ltp.ToLocation.Name,
      TransitionPoint = ltp.TransitionPoint
  }).ToList();

此外,由于您正在投影到视图模型中,因此我切断了.Include()部分并不是必需的。

答案 1 :(得分:1)

如果您尚未禁用lazy loading,则应尝试使用@Peter提出的解决方案。否则,您还可以在查询中加载Section nav属性,将其包含在Include方法中作为参数传递的路径中:

 using (var db = new GeographyContext())
 {
      var model = db.LocationTransitionPoints
                    .Include("FromLocation")
                    .Include("ToLocation.Section")
                    .Select(ltp => new TransitionPointsVM()
                    {
                      FromLocation = ltp.FromLocation.Name,
                      ID = ltp.ID,
                      SectionTitle = ltp.ToLocation.Section.Title, 
                      ToLocation = ltp.ToLocation.Name,
                      TransitionPoint = ltp.TransitionPoint
                    }).ToList();
           //...
}

您可以按照此模式加载更深层次的内容:

Include("FirstLevelNavProp.SecondLevelNavProp...")

但更好的想法是使用另一种强类型的Include扩展方法:

 using (var db = new GeographyContext())
 {
      var model = db.LocationTransitionPoints
                    .Include(ltp=>ltp.FromLocation)
                    .Include(ltp=>ltp.ToLocation.Section)
                    .Select(ltp => new TransitionPointsVM()
                    {
                      FromLocation = ltp.FromLocation.Name,
                      ID = ltp.ID,
                      SectionTitle = ltp.ToLocation.Section.Title, 
                      ToLocation = ltp.ToLocation.Name,
                      TransitionPoint = ltp.TransitionPoint
                    }).ToList();
            //...
}