我有一个相当复杂的带连接的sql语句。这是我使用EF的代码:
var MicrositeResponseAdors = _context.MicrositeResponseAdor
.Include(user => user.UserTracking)
.ThenInclude(tracking => tracking.AddTradeIn)
.Include(user => user.UserTracking)
.ThenInclude(tracking => tracking.TrackingFinance)
.Include(user => user.UserTracking)
.ThenInclude(tracking => tracking.SearchTracking)
.Include(user => user.UserTracking)
.ThenInclude(tracking => tracking.TrackingType)
.Include(user => user.UserTracking)
.ThenInclude(tracking => tracking.Vehicle)
.FirstOrDefault(m => m.Id == id && m.FirstName.ToLower() != "test" && m.LastName.ToLower() != "test");
我需要向没有主键的表添加另一个连接,Entity Framework不允许这样做。我甚至无法假装它。所以我被告知使用我认为名为LINQ的东西来制作更多自定义内容?
我无法弄清楚如何使用原始EF实体类分配我的数据值。以下是我到目前为止的情况:
var MicrositeResponseAdors = (from p in _context.MicrositeResponseAdor
join c in _context.UserTracking on p.Id equals c.UserTrackingId
into pc
select new {
MicrositeResponseAdor = p, MicrositeResponseAdor.UserTracking = pc
}
).FirstOrDefault();
这给出了:
无效的匿名类型成员声明符。
我认为这是因为MicrositeResponseAdor.UserTracking的第一部分。我不知道如何在MicrositeResponseAdor下分配UserTracking。
答案 0 :(得分:0)
您提供的错误是C#编译错误,因为您尝试命名属性MicrositeResponseAdor.UserTracking
。属性名称不能包含点。
这至少会编译:
var micrositeResponseAdor = (
from p in _context.MicrositeResponseAdor
join c in _context.UserTracking on p.Id equals c.UserTrackingId into pc
select new {
MicrositeResponseAdor = p,
UserTracking = pc
}
).FirstOrDefault();
这会使您的UserTracking
出现在两个地方:
micrositeResponseAdor.UserTracking
micrositeResponseAdor.MicrositeResponseAdor.UserTracking
它是第一个,因为你把它放在那里,它在第二个,因为无论如何实体之间存在关系,所以如果它已经在那个上下文中加载它,EF就可以方便地填充它(它有,因为你明确地要求它。
因此,您不必在查询中分配已加载的导航属性,只需通过手动加入,Include
甚至第二次查询来确保加载相关实体。
问题是你为什么要这样做。您已经拥有Include
版本。连接变量只是更详细,但它不会添加任何内容。
不是EF总是在每个实体上都有一个密钥,无论数据库是否认为它是一个密钥。从技术上讲,这与Include
与join
无关。