使用(linq?)和​​ef实体

时间:2017-06-26 08:25:07

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

我有一个相当复杂的带连接的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。

1 个答案:

答案 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出现在两个地方:

  1. micrositeResponseAdor.UserTracking
  2. micrositeResponseAdor.MicrositeResponseAdor.UserTracking
  3. 它是第一个,因为你把它放在那里,它在第二个,因为无论如何实体之间存在关系,所以如果它已经在那个上下文中加载它,EF就可以方便地填充它(它有,因为你明确地要求它。

    因此,您不必在查询中分配已加载的导航属性,只需通过手动加入,Include甚至第二次查询来确保加载相关实体。

    问题是你为什么要这样做。您已经拥有Include版本。连接变量只是更详细,但它不会添加任何内容。

    不是EF总是在每个实体上都有一个密钥,无论数据库是否认为它是一个密钥。从技术上讲,这与Includejoin无关。