【问题标题】:(EF 4.0 vs a normal SQL) Improve execution time in Linq(EF 4.0 与普通 SQL)改进 Linq 中的执行时间
【发布时间】:2013-11-11 13:18:21
【问题描述】:

当我执行这条 SQL 语句时,它绝对不会花时间运行:

select * from [user]
left join licence on [user].userID = licence.UserID
left join licenceProducts on licence.licenceID = licenceProducts.licenceID
left join products on products.productID = licenceProducts.productID
left join contacts on contacts.UserID = [user].userID
left join usersupportedproducts on usersupportedproducts.UserID = [user].userID
left join [user] b on b.userID = [user].ParentUserID
where [user].Type <> 6
order by [user].name

但是,当我使用 EF 4.0 运行相同的查询时,它需要将近 20 秒才能执行。

有没有办法改进这个 Linq 请求,我试过了?

users = null;
using (var db = new DistributorEntities())
{
    try
    {
        users = db.Users
            .Include(u => u.Licences)
            .Include(u => u.Licences.Select(l => l.LicenceProducts.Select(lp => lp.Product)))
            .Include(u => u.UserAddress)
            .Include(u => u.Contact)
            .Include(u => u.User2)
            .Include(u => u.SupportProducts)
            .Where(u => u.Type != (int)UserType.Admin)
            .OrderBy(u => u.Name)
            .ToList();
    }
    catch (Exception ex)
    {
        if (ex is InvalidOperationException)
        {
            _EventLog.WriteEntry(ex.Message + "  WebService.GetAllUsersAndChildren");
        }
        exception = new ServiceError(ex);
    }
}

我尝试通过放置我的 SQl 语句来执行ExecuteStoreQuery(),但它没有加入users 的关系。

【问题讨论】:

  • 您是否使用过 SQL Profiler 来查看该 linq 语句生成的内容?
  • 在我看来,您(在您的 Linq 中)只是像疯子一样渴望加载,而不是离开。
  • 如何在这个Linq语句中做左连接?
  • @billybob 这是 MSDN 中关于如何在 LINQ 中执行 LEFT JOIN 的示例:msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx

标签: c# sql-server performance linq


【解决方案1】:

直接在 SQL 中编写查询几乎总是比在 LINQ 中编写表达式更有效,然后必须将其转换为“次优”SQL。

您可以做的只是创建一个包含您的查询的VIEW,然后将VIEW 映射到实体框架中的Entity,然后查询Entity——这将只执行VIEW在 SQL Server 中。

另见http://www.mssqltips.com/sqlservertip/1990/how-to-use-sql-server-views-with-the-entity-framework/

【讨论】:

  • 使用该方法不会添加导航属性。
  • 但是我需要获取导航属性,所以这不是我想要实现的好方法。
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 2013-02-02
  • 1970-01-01
相关资源
最近更新 更多