Этот вопрос не занимает времени, но если я раскомментирую последнюю строку, это займет 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])
))
решено Оказалось, что INNER JOIN в последнем операторе select не работает.Поэтому я изменил последнюю строку предиката на:
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)));