天道酬勤,学无止境

包括不使用连接实体(Include not working with join entities)

问题

例如,我有以下实体(多对多,我还删除了不必要的道具):

public class Buffet
{
    public int Id {get; set;}
    public string Name {get; set;}
}

public class Recipe
{
    public int Id {get; set;}
    public string Name {get; set;}
    public int CategoryId {get; set;}
    public virtual Category Category {get; set;}
}

public class Category
{
    public int Id {get; set;}
    public string Name {get; set;}
}

加入实体:

public class BuffetRecipe
{
    public int BuffetId {get; set;}
    public virtual Buffet Buffet {get; set;}
    public int RecipeId {get; set;}
    public virtual Recipe Recipe {get; set;}
}

我想获取属于特定自助餐的所有食谱,并希望包含食谱类别。

public IList<Recipe> GetRecipes(int buffetId)
{
    return _dbContext.BuffetRecipes
    .Where(item => item.BuffetId == buffetId)
    .Include(item => item.Recipe)
    .ThenInclude(item => item.Category)
    .Select(item => item.Recipe)
    .ToList();
}

我得到的列表总是返回带有 prop Category = null 的 Recipes。 我没有找到使 Include() 与 Select() 一起工作的解决方案...

我究竟做错了什么??

更新:

我可以让它以这种方式工作...但我的感觉说这不是一个好方法,因为我有 2 个 ToList() 调用...但现在我的结果中包含了类别:

public IList<Recipe> GetRecipes(int buffetId)
{
    return _dbContext.BuffetRecipes
    .Where(item => item.BuffetId == buffetId)
    .Include(item => item.Recipe)
    .ThenInclude(item => item.Category)
    .ToList()
    .Select(item => item.Recipe)
    .ToList();
}
回答1

Include仅在它可以应用于查询的最终结果时才有效。

可以把它改成...

return _dbContext.BuffetRecipes
    .Where(item => item.BuffetId == buffetId)
    .Select(item => item.Recipe)
    .Include(rcp => rcp.Category)
    .ToList()

...但这样做的缺点是你复制了你的Recipe (和他们有BuffetRecipes一样多)。 最好使用Recipe开始查询:

return _dbContext.Recipes
    .Where(rcp => rcp.BuffetRecipes.Any(br => br.BuffetId == buffetId))
    .Include(rcp => rcp.Category)
    .ToList();

你看我冒昧地添加了一个导航属性Recipe.BuffetRecipes 。 这对您的模型应该没有任何问题(相反,我会说)。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 实体框架 4:使用自跟踪实体的过滤器进行预加载(包括)(Entity Framework 4: Eager Loading (Include) with filters using Self Tracking Entities)
    问题 我有一个使用 RTM 模板创建自我跟踪实体的解决方案。 我在 2 个项目之间拆分了实体和上下文,以便在我计划通过 WCF 运行客户端/服务器时可以重用类型定义。 我的服务方法之一需要返回带有“ProductSku”子对象的“Product”对象图,而这些子对象又具有“ProductPrice”子对象。 选择标准将基于“Product”对象的“Name”属性和“ProductPriceObject”的“FinancialPeriodID”属性。 目前,我没有在搜索中包含名称,但是我在带回图表时遇到了问题。 如果我只是执行以下查询(注意,此语法取自 LinqPad 而不是实际的应用程序代码)... from product in Products.Include("Skus.PriceHistory") select product ...然后我可以检索我需要的项目的完整对象图,当然此时没有过滤器。 如果相反,我按如下方式介绍过滤器... from product in Products.Include("Skus.PriceHistory") join sku in ProductSkus on product.ID equals sku.ProductID join price in ProductPrices on sku.ID equals price
  • 实体框架包括性能(Entity Framework Include performance)
    问题 我一直在研究实体框架的性能,特别是关于Includes的使用以及生成和执行各种查询所花费的时间。 我将详细说明我所做的更改,但如果您认为这些假设中的任何一个是错误的,请纠正我。 首先,我们在一个 db 中有大约 10,000 个项目(不是很多),并且数据库被显着标准化(这导致了大量的导航属性)。 目前的方法是延迟加载所有内容,并且考虑到请求一个项目可以缓冲数十个数据库请求,性能很差,尤其是对于较大的数据集。 (这是一个继承的项目,第一步是尝试在不进行重大重组的情况下提高性能) 因此,我的第一步是获取查询结果,然后将导航属性的Includes仅应用于这些结果。 我知道这在技术上会执行 2 个查询,但是如果我们存储了 10,000 个项目,但只想返回 10 个项目,那么只包含这 10 个项目的导航属性更有意义。 其次,在查询结果上使用多个包含并且结果集大小非常大的情况下,它仍然受到性能不佳的影响。 关于何时急切加载以及何时保留延迟加载,我一直很务实。 我的下一个更改是批量加载查询包含,因此执行: query.Include(q => q.MyInclude).Load(); 这再次显着提高了性能,尽管更多的 db 调用(每批包含一个)它比大型查询更快,或者至少减少了 Entity Framework 尝试生成大型查询的开销。 所以代码现在看起来像这样: var query =
  • 实体框架多对多工作,但包括不(Entity Framework Many to Many works but Include does not)
    问题 我与这 3 个表有典型的多对多关系 [Post] ( [PostId] int, (PK) [Content] nvarchar(max) ... ) [Tag] ( [TagId] int, (PK) [Name] nvarchar ... ) [TagPost] ( [TagId] int, (PK, FK) [PostId] int (PK, FK) ) 而且,TagId 和 PostId 是相应地在表上设置的 PK 和 FK。然后我在 c# 中有这些类和映射 public class Post { public Post() { this.Tags = new HashSet<Tag>(); } [Key] public int PostId { get; set; } ... public virtual ICollection<Tag> Tags { get; private set; } } public class Tag { public Tag() { this.Posts = new HashSet<Post>(); } [Key] public int TagId { get; set; } ... public virtual ICollection<Post> Posts { get; private set; } } internal class
  • 实体框架 6 上下文不检索导航属性(Entity Framework 6 context not retrieving navigation properties)
    问题 我发现了许多其他帖子,但他们并没有面临完全相同的问题。 他们使用的代码略有不同。 所以我认为值得回顾一下。 我首先使用 EF6 代码,并创建了一个具有一些导航属性的客户端实体。 我将仅发布相关代码,考虑还有更多属性和外键,但与问题无关。 模型生成正常。 public class Client { public Client() { JobsExperiences = new Collection<JobsExperience>(); CapacitationCourses = new Collection<CapacitationCourse>(); ScholarLevelDetails = new Collection<ScholarLevelDetail>(); Relatives = new Collection<Relative>(); } public long ClientID { get; set; } public virtual ICollection<ScholarLevelDetail> ScholarLevelDetails { get; set; } public virtual ICollection<JobsExperience> JobsExperiences { get; set; } } 现在我创建了一个 ClientServices 类
  • Entity Framework 6.1.0 Code First中的连接约定(Conventions for joins in Entity Framework 6.1.0 Code First)
    问题 我相信我的问题很简单(不确定答案是否也是如此): 有人知道如何强制Entity Framework使用“ INNER JOIN”作为默认约定,而不是“ LEFT OUTER JOIN”吗? 回答1 如果要显式强制执行内部联接或外部联接,则始终可以分别分别使用Join或GroupJoin方法。 (或综合等效项join然后join ... into )。 但是,通常来说,在LINQ语句中,应该避免使用显式的join语句。 请改用导航属性。 导航属性是已在实体之间定义的关联。 通过导航属性进行查询就是通过联接进行查询,而无需手动对其进行编码。 但是这些连接何时会成为内部的或外部的? 采取以下三个简单的类: class Product { public int Id { get; set; } public string Name { get; set; } public int CategoryId { get; set; } public Category Category { get; set; } public int? PhotoId { get; set; } public Photo Photo { get; set; } } class Category { public int Id { get; set; } public string Name { get
  • 实体框架包含左连接这可能吗?(Entity Framework include with left join is this possible?)
    问题 我有以下表格 教室 (ClassID,ClassName) StudentClass (StudentID,ClassID) 学生(学生 ID、学生姓名等) 学生说明。 (学生描述ID,学生ID,学生描述) 我要检索student==1的所有信息 在 sql 中,我会做类似下面的事情并获取有关学生的所有信息。 select * from Student s join StudentClass sc on s.StudentID=sc.StudentID join ClassRoom c on sc.ClassID=c.ClassID left join StudentDescription sd on s.StudentID=sd.StudentID where s.StudentID=14 现在我的问题。使用 EF4 我做了这样的事情,但不能让它工作。 你也可以做一个包含和一个左连接 尝试 1 private static StudentDto LoadStudent(int studentId) { StudentDto studentDto = null; using (var ctx = new TrainingContext()) { var query = ctx.Students .Include("ClassRooms") .Include(
  • 实体框架包含命令-左联接还是内联接?(Entity framework Include command - Left or inner join?)
    问题 当我调查Include和Join之间的区别时,我发现: 如果数据库不包含外键-它没有导航道具,那么最好使用Join 如果确实有导航道具,则使用Include 。 (它还会保存数据库命中率。) 但是这里有一个答案引起了我的注意: 包含被实现为联接。 根据所包含链接的可空性,它是内部联接或左联接。 问题 : 无效性如何影响左/内联接? 在Sql Server中,我可以有一个Cities表和Persons表,一个人可以有一个NULL CityID 。 为什么实体框架为我决定它是一种什么样的联接? 编辑:可视化: 现在让我们将CityId更改为不为null: 这是更改: 回答1 假设您的班级中对City或CityID有[Required]约束。 并假设有没有(有效)城市的“人”记录。 满足[Required]的唯一方法是执行内部联接。 但是,只要您的Db和模型中的约束条件匹配(即CityID INT NOT NULL ),那么使用哪种连接就无关紧要了。 那应该是正常情况。 在没有约束的情况下,您当然会期望得到“左连接”。 回答2 我知道这是一个古老的问题,但是如果有人使用我的EF Code First降落在这里,我的问题就在于流畅的映射: protected override void OnModelCreating(DbModelBuilder modelBuilder) {
  • 如何使用 LINQ to Entities 查询连接表?(How to join tables using LINQ to Entities query?)
    问题 我有一个简单的数据库结构: public class Person { [Key] public int PersonID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } public class Transport { [Key] public int TransportID { get; set; } public string Model { get; set; } public string Brand { get; set; } } public class Accident { [Key] public int AccsidentID { get; set; } public DateTime AccidentDate { get; set; } public int TransportID { get; set; } [ForeignKey("TransportID")] public virtual Transport Transport { get; set; } public int PersonID { get; set; } [ForeignKey("PersonID")] public virtual Person
  • 实体框架如何与递归层次结构一起使用? Include()似乎不适合(How does Entity Framework work with recursive hierarchies? Include() seems not to work with it)
    问题 我有一个Item 。 Item具有Category 。 Category具有ID , Name , Parent和Children 。 Parent和Children也属于Category 。 当我对特定Item进行LINQ to Entities查询时,除非我使用Include("Category")方法,否则它不会返回相关的Category 。 但是它并没有带来完整的类别,包括其父级和子级。 我可以做Include("Category.Parent") ,但是这个对象就像一棵树,我有一个递归层次结构,我不知道它在哪里结束。 如何使EF完全加载带有父级和子级的Category ,以及父级及其父级和子级的加载,依此类推? 对于整个应用程序来说,这并不是什么问题,出于性能方面的考虑,仅对于该特定实体(类别)才需要。 回答1 可以使用Load来代替使用Include方法。 然后,您可以为每个子对象执行一个操作,并遍历所有子对象,并加载他们的子对象。 然后为每个通过孩子的孩子做一个,依此类推。 向下移动的级别数将被硬编码为每个循环的数量。 这是使用Load的示例:http://msdn.microsoft.com/zh-cn/library/bb896249.aspx 回答2 如果您确实要加载整个层次结构,那么如果是我,我将尝试编写一个存储过程,由谁来做
  • 实体框架包括无关系(Entity Framework Include without Relations)
    问题 我正在使用实体框架进行一个庞大的项目。 因为我使几乎所有实体都依赖于时间,所以不可能再使用实体之间的关系(我自己管理关系)。 出现的问题是我无法再像以前那样轻松地查询数据。 假设我有一个名为Student的实体。 该实体包含属于学生的Books (列表)集合。 每本书都包含一个来自数据库的作者属性。 为了加载所有学生的书和相应的作者,我要么必须编写数百个自定义查询(fe linq),要么懒加载它们,这会导致很大的性能影响。 实际上,如果我可以在没有关系的情况下使用实体框架的 Inlude,那就太好了。 有谁知道如何实现这一目标? 谢谢你。 回答1 如果实体框架不管理表之间的关系,则它无法使用.Include()来在 SQL 调用中创建连接。 您最好的选择是像往常一样将相关实体添加到父级,但使用[NotMapped]属性。 然后,您可以使用自定义 SQL 调用来执行查找并在需要时填充属性。 然而,我对你的陈述感到困惑,因为实体是“依赖于时间的”,你不能使用关系,这只是数据库中的外键......也许你可以做其他事情来优化你的实体。 如果您正在管理自己的项目之间的关系,那么您将很多责任从您的数据库转移到您的应用程序中,这似乎已经有很多工作要做。 更新 在实体框架中实施审计跟踪是一个相当标准的过程,可能比管理您的关系容易得多。 审计跟踪基本上包括为Context
  • JPA2 Criteria 查询实体层次结构(JPA2 Criteria queries on entity hierarchy)
    问题 假设我有以下实体域: @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="TYPE") public abstract class Entity1 { //some attributes } @Entity @DiscriminatorValue("T1") public class Entity2 extends Entity1 { @OneToMany(fetch=FetchType.EAGER, cascade = { CascadeType.ALL }, mappedBy="parent") @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) private Set<Entity1Detail> details = new HashSet<Entity1Detail>(); } @Entity public class Entity1Detail { @ManyToOne @JoinColumn(name="REF") private Entity2 parent; @Basic private Integer quantity; } @Entity
  • 修改 IQueryable.Include() 的表达式树,为 join 添加条件(Modify the expression tree of IQueryable.Include() to add condition to the join)
    问题 基本上,我想实现一个存储库,即使通过导航属性也可以过滤所有软删除的记录。 所以我有一个基本实体,类似于: public abstract class Entity { public int Id { get; set; } public bool IsDeleted { get; set; } ... } 和一个存储库: public class BaseStore<TEntity> : IStore<TEntity> where TEntity : Entity { protected readonly ApplicationDbContext db; public IQueryable<TEntity> GetAll() { return db.Set<TEntity>().Where(e => !e.IsDeleted) .InterceptWith(new InjectConditionVisitor<Entity>(entity => !entity.IsDeleted)); } public IQueryable<TEntity> GetAll(Expression<Func<TEntity, bool>> predicate) { return GetAll().Where(predicate); } public IQueryable<TEntity>
  • 实体框架4与NHibernate [关闭](Entity Framework 4 vs NHibernate [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 改善这个问题 在网络上(以及在stackoverflow上)已经谈论了很多关于Entity Framework第一版的问题,很明显,当我们已经有了更好的替代方案(如NHibernate)时,这不是一个好选择。 但是我找不到Entity Framework 4和NHibernate的很好的比较。 我们可以说今天NHibernate在所有.NET ORM中处于领先地位,但是我们可以期望Entity Framework 4取代NHibernate的位置。 我认为,如果Microsoft确实在EF4中注入了非常好的功能,则它可以与NHibernate竞争,因为它具有Visual Studio集成,易于使用并且在大多数商店中总是优先考虑MS产品。 回答1 EF4对于“自我跟踪实体”中的n层开发具有开箱即用的答案。 没有人发布过类似的NHib代码。 NHib具有许多未被提及为EF4的功能。 这些包括二级缓存集成。 它还在继承映射方面具有更大的灵活性,可以与存储的proc /数据库函数/自定义SQL /触发器更好地集成,支持公式属性等。 IMO作为ORM基本上已经成熟了。 回答2 更新:从版本4.0开始,我还没有使用实体框架
  • 如何使用存储库模式和实体框架连接多个表?(How to join Multiple tables using Repository Pattern & Entity Framework?)
    问题 我需要使用存储库模式和实体框架(使用 C#)连接多个表。 这可能吗? 如果是这样,请让我知道如何做同样的事情。 回答1 在 EF 中,连接表是通过使用导航属性完成的。 基本上,EF 为您做这件事。 在您的 Repositories 中实现时,无论它是否为 Generic,您都可以在构建查询表达式时调用 Include 方法来告诉 EF 为您填充导航属性。 假设我们有这些 POCO 类: public class Dog { public int DogId { get; set; } public string Name { get; set; } public int OwnerId { get; set;} public Owner Owner { get; set; } // the navigation property } public class Owner { public int OwnerId { get; set; } public string Name { get; set; } // another navigation property // all the dogs that are related or owned by this specific owner public ICollection<Dog> DogList { get; set
  • 优化实体框架查询(Optimize entity framework query)
    问题 我正在尝试用自己的时间制作一个stackoverflow克隆来学习EF6和MVC5,我目前正在使用OWin进行身份验证。 当我有50-60个问题时,一切工作都很好,我使用Red Gate数据生成器,并尝试通过几千个子表行将其增加到一百万个问题,而没有关系,只是有点“强调” ORM。 这是linq的样子 var query = ctx.Questions .AsNoTracking() //read-only performance boost.. http://visualstudiomagazine.com/articles/2010/06/24/five-tips-linq-to-sql.aspx .Include("Attachments") .Include("Location") .Include("CreatedBy") //IdentityUser .Include("Tags") .Include("Upvotes") .Include("Upvotes.CreatedBy") .Include("Downvotes") .Include("Downvotes.CreatedBy") .AsQueryable(); if (string.IsNullOrEmpty(sort)) //default { query = query
  • 实体框架核心2.0.1渴望在所有嵌套相关实体上加载(Entity Framework Core 2.0.1 Eager Loading on all nested related entities)
    问题 我有一个简单的问题,但似乎无法解决。 我正在使用Entity Framework Core 2.0.1版,并且希望在默认情况下急于加载我的所有实体。 例子: public class Order { public int Id { get; set; } public string Name { get; set; } public int CustomerId { get; set; } public Customer Customer { get; set; } } public class Customer { public int Id { get; set; } public string Name { get; set; } public int AddressId { get; set; } public Address Address { get; set; } } public class Address { public int Id { get; set; } public string PostCode { get; set; } public string City { get; set; } } 但是当我加载Order实体时,相关的实体Customer然后在其内部Address为null 我试过的 尝试升级到版本2.1
  • 实体框架:如何对自定义类型进行正确的“包含”(Entity Framework: how to do correct “Include” on custom type)
    问题 假设我们有 2 种类型,通过 EF 4 映射到数据库。 Schedule 1.....1 Visit 此外,我们还有第三种自定义视图类型 public class ScheduleView { public Schedule Schedule { get; set; } public Visit Visit { get; set; } } 所以我们可以编写连接查询 var query = Context.Schedule.Join(Context.Visit ,/*Schedule join key definition*/,/*Visit join key definition*/, (scheduleView, visit) => new ScheduleView {Schedule = scheduleView, Visit = visit}) 问题是我还需要加载Visit类型的Patient属性。 但是当我写 query = (query as ObjectQuery<ScheduleView>).Include("Visit.Patient"); 我收到运行时错误 无法将类型“System.Linq.IQueryable 1' to type 'System.Data.Objects.ObjectQuery 1”。 LINQ to Entities
  • 如何不使用 Hibernate Envers 审计连接表和相关实体?(How not to audit a join table and related entities using Hibernate Envers?)
    问题 我使用 Hibernate Envers 来审计我的实体。 我有一个经过审计的实体Foo ,它有一个List<Bar>作为属性。 但是,我不想审计Bar实体。 因此,我写道: @Entity @Audited public class Foo { @JoinTable(name = "T_FOO_BAR", joinColumns = @JoinColumn(name = "FOO_ID"), inverseJoinColumns = @JoinColumn(name = "BAR_ID")) @ManyToMany(cascade = PERSIST) @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) public List<Bar> getBars() { return bars; } } 现在,我想检索Foo的修订版: AuditReader reader = AuditReaderFactory.get(getEntityManager()); Foo revision = (Foo) reader.createQuery().forEntitiesAtRevision(Foo.class, 42).getSingleResult(); 不幸的是,当我想检索所有数据时(即当它延迟加载bars
  • Asp.net MVC View中的延迟执行是一件很糟糕的事情吗?(Is Deferred Execution in Asp.net MVC View a very bad thing?)
    问题 假设我有以下通过实体框架获取的模型: public class User{ public string Name {get;set;} public int Id {get;set;} } 从用户表中获取所有用户: IEnumerable<User> users = from u in myDbContext.Users select u; 在视图中重命名用户(@model IEnumerable): @foreach(var item in Model) { <tr>@item.Id</tr> <tr>@item.Name</tr> } 我的新老板告诉我,这种方式不符合MVC,性能会很差。 我应该做的是使用.ToList()使Controller中的所有USERS都材料化。 我不确定哪个更好,因为无论哪种方式,用户都必须实现,并且我看不到任何性能损失。 回答1 延迟执行意味着,直到开始访问users集合中的项目(当您遍历foreach循环中的项目时),才会执行LINQ表达式后面的实际SQL查询。 这意味着,如果您尝试访问User实体上的导航属性(并且它是唯一记录),将执行SELECT查询。 如果您只有一个用户表(如您在问题中所显示的那样)而没有任何外键/有效属性,那么使用以上代码,EF将仅执行一个查询以从User表中获取数据。 但是通常情况并非如此
  • 使用 LINQ to Entities 编写嵌套连接(Writing a nested join with LINQ to Entities)
    问题 我很确定这里某处有一个这样的例子,我只是找不到它,因为我不知道确切的术语。 所以,请善待。 问题应该很简单: 我有一个 Azure SQL 数据库,设计得有些糟糕(即缺少外键等)。 由于此时我无法重新设计数据库,我必须通过查询手动处理关系。 由于数据库也是我们软件的瓶颈,我必须尝试以尽可能少的数据库命中来完成查询。 我有实体 A、B、C 和 D。一个实体 A 有几个实体 B(与一个未注册的外键连接),一个实体 B 有几个实体 C,一个实体 C 有几个实体 D。 我有实体 A 的 ID,并希望尽可能最佳地返回所有连接实体的树,直到 Ds。 出发: from A in dbA.Where(e=>e.Id==IDParameter) join B in dbB on A.Id equals B.AId into Bs 现在我需要用 B 中的每个 B 来为 C 做这件事,再用 C 来为 D 做这件事。如果我采用显而易见的方式,首先加入 Ds 和 Cs,然后是 Bs 和 Cs,最后是 As 和 Bs,这意味着将所有 Ds 与 Cs 连接起来,然后所有...你明白了,直到我最终到达 IDParameter 过滤器。 它只是似乎无效。 在单个查询中是否有正确的 C# 方法来执行此操作? 回答1 当您定义了关系时,您可以使用手动连接模拟 EF 所做的事情。 您所需要的只是使用组连接和投影。