C# 将(linq?)与ef实体一起使用

C# 将(linq?)与ef实体一起使用,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,我有一个相当复杂的带有连接的sql语句。以下是我使用EF的代码: var MicrositeResponseAdors = _context.MicrositeResponseAdor .Include(user => user.UserTracking) .ThenInclude(tracking => tracking.AddTradeIn) .Include(user => user.UserTracking) .ThenI

我有一个相当复杂的带有连接的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");
我需要向没有主键的表添加另一个连接,实体框架不允许这样做。我甚至不能假装。所以我被告知要用我认为叫做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();
这使得:

无效的匿名类型成员声明符


我认为这是因为MicrositeResponseReador.UserTracking的第一部分。我不知道如何在MicroSiteResponseReador下分配UserTracking。

您给出的错误是C编译错误,因为您试图命名属性MicroSiteResponseReador.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();
这将使您的用户跟踪显示在两个位置:

MicroSiteResponseReador.UserTracking MicroSiteResponseReador.MicroSiteResponseReador.UserTracking 它在第一个是因为你把它放在那里,在第二个是因为实体之间存在某种关系,所以如果EF已经在那个上下文中加载了它,它就可以方便地填充它,因为你明确地要求它

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

问题是你为什么这么做。您已经有了包含版本。join变量更详细,但它没有添加任何内容


并不是说EF总是在每个实体上都有一个键,不管数据库是否认为它是一个。从技术上讲,这与Include vs join无关。

ORM中的连接是一种非常强烈的气味。orm处理具有关系的对象。ORM不是数据库,LINQ也不是SQL的替代品。您需要向MicrositeResponseADOR类添加另一个关系。可能只是一个公共UserTracking UserTracking{get;set;}。如果表、字段遵循约定,EF将检测该关系,而它们似乎也遵循约定。查询根本不需要更改。顺便说一句,您发布的EF代码不显示任何连接。仅加载单个实体。所有这些都包括强制加载,它们与连接无关。如果你不需要快速加载,你甚至可以去掉它们。是的,使用ORM可以很好地工作,但是我们必须添加另一个不存在的关系,这个关系没有主键。由于时间限制和管理,我们现在无法修复它,因此我们需要一个临时的变通方法,这种变通方法不是使用ORM,而是尝试通过LINQ加载它。至于EF和Include,通过阅读其他文章,我非常确定Include在幕后的SQL中有一个左外连接。我需要所有这些东西都连接起来,再加上一个,没有主键。你误解了文章。Include仅用于强制加载。对于左连接或内连接,它可以这样做,也可以不这样做,但您不能依赖于此。这种策略确实会从一个版本变为另一个版本。如果没有关系,Include只会引发错误。最后,如果select需要来自相关类的数据,则可以生成JOIN。ORM可以做任何它认为合适的事情来返回您指定的结果。