EF Core генерирует неправильный SQL для группы - PullRequest
1 голос
/ 28 марта 2019

У меня следующий запрос LINQ в моем ASP.NET Core Web API:

var _accountId = 101;

var textChatRecords = (from message in _dbContext.Messages
 join user in _dbContext.User on new { message.AccountId, message.UserId }
 equals new { user.AccountId, user.UserId }
 where message.AccountId == _accountId
 group new { message, user } by new { message.UserId, user.UserIdentifier } into g
 select new ReturnModel
 {
     UserId = g.FirstOrDefault().user.UserId,
     UserName = g.FirstOrDefault().user.UserName,
     UnReadCount = g.Count(x => !x.message.IsRead),
     SortID = g.Max(x => x.message.TextChatLogId),
     UserIdentifier = g.FirstOrDefault().user.UserIdentifier,
     UserFirstName = g.FirstOrDefault().user.UserName,
     UserLastName = g.FirstOrDefault().user.UserName
 }).OrderByDescending(x => x.SortID);

Позже в коде я делаю

returnModel = returnModel.Where(x => x.UserName.Contains(request.userName));

Но я обнаружил, что Contains() в приведенной выше строке чувствителен к регистру даже после того, как поле в SQL Server нечувствительно к регистру.

, что привело меня к выводу, что запрос выполняется на C #сторона, а не в SQL Server.Поэтому я открыл SQL Profiler и проверил выполняемый запрос.Вот что было:

exec sp_executesql N'SELECT [message].[AccountId], [message].[TextChatLogId], [message].[CommunicationLogId], [message].[CreatedBy], [message].[CreatedOn], [message].[Direction], [message].[IsRead], [message].[LastUpdatedBy], [message].[LastUpdatedOn], [message].[Message], [message].[UserId], [message].[RowVersionStamp], [user].[AccountId], [user].[UserId], [user].[AddressLine1], [user].[AddressLine2], [user].[Age], [user].[City], [user].[CreatedDate], [user].[DefaultHygenistId], [user].[DefaultLocationId], [user].[DefaultProviderId], [user].[Email], [user].[EmailNotification], [user].[FirstName], [user].[Gender], [user].[IsActive], [user].[LastName], [user].[Mobile], [user].[UserIdentifier], [user].[UserName], [user].[PhoneWithExt], [user].[PostalNotification], [user].[PreferredContactTextMedium], [user].[PreferredContactVoiceMedium], [user].[PromotionEmailNotification], [user].[RelationshipToResponsibleParty], [user].[ResponsiblePartyUserId], [user].[State], [user].[TextNotification], [user].[Type], [user].[VoiceNotification], [user].[WorkPhoneWithExt], [user].[ZipCode]
FROM [pat_eng].[Messages] AS [message]
INNER JOIN [pat_eng].[User] AS [user] ON ([message].[AccountId] = [user].[AccountId]) AND ([message].[UserId] = [user].[UserId])
WHERE [message].[AccountId] = @___accountId_0
ORDER BY [message].[UserId], [user].[UserIdentifier]',N'@___accountId_0 int',@___accountId_0=101

В этом SQL-запросе нет ни одного group by или Contains, который я написал в коде C #.

Почему мой LINQ переведен в неправильный SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...