【问题标题】:Filling child entity with Entity Framework SqlQuery使用实体框架 SqlQuery 填充子实体
【发布时间】:2013-03-17 01:20:45
【问题描述】:

我在 1:n 关系中有两个实体:类别和产品。

public class Category 
{
   public int CategoryID { get; set; }
   public string CategoryName { get; set; }

   public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
   public int ProductID { get; set; }
   public string ProductName { get; set; }

  public virtual Product { get; set; }
}

public class context : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

通过急切加载可以加载每个类别的产品。

context.Categories.Include(c=>c.Products).ToList()

如何在下面的查询中加载每个类别中的产品,与急切加载相同?

var q = @"
   SELECT Categories.*
   JOIN Products
   ON Category.CategoryId = Products.CategoryId";
var c = context.Categories.SqlQuery(q).ToList();

它只是一个简单的查询。我需要使用 SqlQuery 来执行一些查询。

【问题讨论】:

    标签: entity-framework-5


    【解决方案1】:

    根据this explanation你不能:

    应编写查询以确保它返回真正请求类型的实体

    (我的重点)

    所以只有通过延迟加载(如果启用),您才能在SqlQuery 运行之后加载类别的Products,这将导致n+1 个查询。

    【讨论】:

    • 对于 Google 之外的其他所有人,我想确保他们了解 dbContext.Database.SqlQuery&lt;T&gt;()dbContext.TableName.SqlQuery() 不同。不同之处在于您在Database 上调用它并为其提供类型,而不是表格并且没有类型。让我有点困惑。
    • @TankorSmash 那么这可以使用dbcontext.database.sqlquery 版本来完成吗?
    【解决方案2】:

    如果结果包含多个实体类型,我认为不可能实现从 Sql 查询获得的实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      相关资源
      最近更新 更多