Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF Core为group by生成错误的SQL_C#_Linq_Entity Framework Core - Fatal编程技术网

C# EF Core为group by生成错误的SQL

C# EF Core为group by生成错误的SQL,c#,linq,entity-framework-core,C#,Linq,Entity Framework Core,我的ASP.NET核心Web API中有以下LINQ查询: 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.Acco

我的ASP.NET核心Web API中有以下LINQ查询:

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.Wherex=>x.UserName.Containsrequest.UserName

但我发现,即使SQL Server中的字段不区分大小写,上面一行中的Contains也是区分大小写的

这让我得出结论,查询是在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查询没有我用C代码编写的任何GROUPBY或Contains


为什么我的LINQ被翻译成错误的SQL?

LINQ不是SQL,也不是SQL的替代品。ORM的工作是从实体关系创建连接。如果必须在LINQ中使用join,则表示模型中缺少关系。至于查询本身,groupnew{message,user}正试图创建一个新对象,就像它是一个SELECT对象一样。EF核心将如何将其转换为SQL?至于问题本身,一个不幸的EF核心特性是对无法转换为SQL的部分进行客户端查询求值。组new{…}之前的查询可以转换为SQL。然后将结果分组到服务器上。@PanagiotisKanavos您的意思是在客户端上分组吗?EF Core在这种类型的查询中有问题,与EF 6.x不同,您使用的是什么版本的EF Core?EF Core 2.1在这方面做得更好,EF Core 3.0可能会赶上EF 6。也可能不是。@NetMage facepalmLINQ不是SQL,也不是SQL的替代品。ORM的工作是从实体关系创建连接。如果必须在LINQ中使用join,则表示模型中缺少关系。至于查询本身,groupnew{message,user}正试图创建一个新对象,就像它是一个SELECT对象一样。EF核心将如何将其转换为SQL?至于问题本身,一个不幸的EF核心特性是对无法转换为SQL的部分进行客户端查询求值。组new{…}之前的查询可以转换为SQL。然后将结果分组到服务器上。@PanagiotisKanavos您的意思是在客户端上分组吗?EF Core在这种类型的查询中有问题,与EF 6.x不同,您使用的是什么版本的EF Core?EF Core 2.1在这方面做得更好,EF Core 3.0可能会赶上EF 6。或者不可以。@NetMage facepalm