0

この 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

4

1 に答える 1

1

ほとんどの場合、SQL でクエリを直接記述する方が、LINQ で式を記述してから「最適ではない」SQL に変換するよりもはるかに効率的です。

あなたができることは、クエリを含む を作成し、それを Entity Framework にVIEWマップしてVIEWからクエリを実行することです。これにより、SQL Server で実行されます。EntityEntityVIEW

http://www.mssqltips.com/sqlservertip/1990/how-to-use-sql-server-views-with-the-entity-framework/も参照してください。

于 2013-10-31T13:46:55.997 に答える