我已经构建了一个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
(通过ToLoation
和FromLocation
),但它没有直接链接到{{ 1}}我不知道如何努力(LocationTranitionPoints - &gt; Locations - &gt; Section)
我有一种感觉我只是错过了一些愚蠢的小东西,但不能把手指放在上面,有什么建议吗?
Section
答案 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();
//...
}