【问题标题】:Eager loading entities with raw SQL使用原始 SQL 急切加载实体
【发布时间】:2013-06-11 15:57:03
【问题描述】:

我知道在实体框架(代码优先)中可以使用this 之类的原始 SQL 加载实体:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList();
}

但是是否也可以使用这种方法以某种方式急切地加载导航属性?我想编写一个自定义查询来加载一个复杂的实体并急切地加载它的导航属性(使用 EF 和 Includes 已被证明太慢了)。

【问题讨论】:

  • 我也有同样的情况。我想避免使用 linq 和 include 方法,而是使用带有急切加载的原始 sql。
  • 原始 SQL 的全部意义在于绕过 LinqToSql 并强制 EF 执行您想要的语句。 EF 执行的唯一功能是反序列化输出。急切加载是 LinqToSql 的特性,它会影响将生成的 SQL 发送到服务器执行。您能否详细说明您试图通过这种方式解决的问题?
  • 你可以试试这个。 var query = from emp in context.ContactSet.OfType.Include("Slaves") where emp is Employee select emp; OfType 子句将只返回雇员类型的对象,这是定义从属导航属性的地方。我认为这会有所帮助。
  • 你的 .Include() 性能问题是基于什么? .Include() 肯定会更改 SQL 语句,但性能应该不会比单独加载更差。但是,不同之处可能在于,当您使用 SqlQuery() 手动加载时,EF 不会跟踪与 LinqToObject 查询不同的实体,这可能会导致差异。您可以关闭对象跟踪,看看它对性能有何影响。

标签: c# .net entity-framework ef-code-first entity-framework-5


【解决方案1】:

您需要首先将博客附加到上下文,然后显式加载您需要的每个属性。据我所知,这需要单独完成,例如在foreach 内。

foreach (var blog in blogs)
{
    context.Blogs.Attach(blog);

    context.Entry(blog).Collection(a => a.Comments).Load();
    context.Entry(blog).Reference(a => a.Author).Load();

    // Here you can use blog.Author and blog.Comments with no problem.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多