0

この質問の実行にはまったく時間がかかりませんが、最後の行のコメントを外すと、5 秒かかります。これがクエリにどのように影響するのでしょうか? ほぼ同じクエリです。

return db.Parties.Where(predicate).Select(p => new SearchResult
{
    adressPerson = p.Contacts.SingleOrDefault(m => m.contact_type == "H").streetname,
    //adressOrg = p.Contacts.SingleOrDefault(m => m.contact_type == "W").streetname
});  

問題を特定するにはどうすればよいですか?

述語は次のようになります。

    predicate = predicate.Or(p => p.surname.EndsWith(keyword));
    predicate = predicate.Or(p => p.lastname.EndsWith(keyword));
    predicate = predicate.Or(p => p.organisation.EndsWith(keyword));
    predicate = predicate.Or(p => p.Contacts.Any(c => c.streetname.EndsWith(keyword)));
    predicate = predicate.Or(p => p.Memberships.Any(m => m.Congregation.congregation_name.EndsWith(keyword)));
    predicate = predicate.Or(p => p.PartyCategories.Any(m => m.Category.category_name.EndsWith(keyword) || m.Category.category_code.EndsWith(keyword)));  

たくさんのコードを投稿するのはばかげていることはわかっていますが、とにかくここに SQL クエリがあります。手がかりはありますか?

SELECT (
    SELECT [t6].[streetname]
    FROM [dbo].[Contact] AS [t6]
    WHERE ([t6].[contact_type] = @p7) AND ([t6].[party_id] = [t0].[party_id])
    ) AS [adressPerson], (
    //SELECT [t7].[streetname]
    //FROM [dbo].[Contact] AS [t7]
    //WHERE ([t7].[contact_type] = @p8) AND ([t7].[party_id] = [t0].[party_id])
    //) AS [adressOrg]
FROM [dbo].[Party] AS [t0]
WHERE ([t0].[surname] LIKE @p0) OR ([t0].[lastname] LIKE @p1) OR ([t0].[organisation] LIKE @p2) OR (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[Contact] AS [t1]
    WHERE ([t1].[streetname] LIKE @p3) AND ([t1].[party_id] = [t0].[party_id])
    )) OR (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[Membership] AS [t2]
    LEFT OUTER JOIN [dbo].[Congregation] AS [t3] ON [t3].[congregation_id] = [t2].[congregation_id]
    WHERE ([t3].[congregation_name] LIKE @p4) AND ([t2].[party_id] = [t0].[party_id])
    )) OR (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[PartyCategories] AS [t4]
    INNER JOIN [dbo].[Category] AS [t5] ON [t5].[category_id] = [t4].[category_id]
    WHERE (([t5].[category_name] LIKE @p5) OR ([t5].[category_code] LIKE @p6)) AND ([t4].[party_id] = [t0].[party_id])
))

解決済み 最後の select ステートメントのINNER JOIN が機能しないことが判明しました。そこで、述語の最後の行を次のように変更しました。

predicate = predicate.Or(p => p.PartyCategories
    .GroupJoin(db.Categories, b => b.category_id, c => c.category_id, (b, c) => new { b, c })
    .SelectMany(c => c.c.DefaultIfEmpty(), (c, b) => new { c.c, b })
    .Any(m => m.b.category_name.EndsWith(keyword) || m.b.category_code.EndsWith(keyword)));
4

2 に答える 2

2

問題を特定するにはどうすればよいですか?

いつものように、それを見つける方法は、生成された SQL を見て、それを SQL プロファイラーで実行することです。

私の推測では、単一の連絡先タイプのみに関心がある場合の単純な内部結合から、より複雑なもの、または「N + 1-selects」の問題にさえ変わると思います。とにかく、SQL を調べると、より明確になるはずです。

于 2011-09-12T08:43:27.980 に答える
0

ニクラス、

そのレベルで何が起こっているかを確認するために、提案されているように SQL を調べます。また、エンティティ.Include()を熱心にロードするため、最初の linq クエリで実行することをお勧めします。Contacts, Memberships and PartyCategoriesそうしないと、間違いなく N+1 選択パターンで遅延読み込みになります。.included の使用法については、次のリンクを参照してください。

http://blogs.msdn.com/b/alexj/archive/2009/06/02/tip-22-how-to-make-include-really-include.aspx

Linq-to-entities - Include() メソッドが読み込まれない

http://www.singingeels.com/Articles/Entity_Framework_and_Lazy_Loading.aspx

乾杯...

于 2011-09-12T09:28:02.097 に答える