C# 这个LINQ synatx有什么问题?
我正在尝试将SQL查询转换为LINQ。不知何故,我的计数(不同的(x))逻辑似乎工作不正常。原始SQL非常有效(或者我认为是这样),但生成的SQL甚至没有返回正确的结果 我正试图修复这个LINQ,使其与原始SQL一样,以一种与原始查询一样高效的方式进行操作。如果我被困在这里,我会非常感激您的帮助:( SQL正在运行,我需要对以下各项进行可比较的LINQ:C# 这个LINQ synatx有什么问题?,c#,sql,linq,linq-to-sql,C#,Sql,Linq,Linq To Sql,我正在尝试将SQL查询转换为LINQ。不知何故,我的计数(不同的(x))逻辑似乎工作不正常。原始SQL非常有效(或者我认为是这样),但生成的SQL甚至没有返回正确的结果 我正试图修复这个LINQ,使其与原始SQL一样,以一种与原始查询一样高效的方式进行操作。如果我被困在这里,我会非常感激您的帮助:( SQL正在运行,我需要对以下各项进行可比较的LINQ: SELECT [t1].[PersonID] AS [personid] FROM [dbo].[Code] AS [t0] INNER J
SELECT [t1].[PersonID] AS [personid]
FROM [dbo].[Code] AS [t0]
INNER JOIN [dbo].[phonenumbers] AS [t1] ON [t1].[PhoneCode] = [t0].[Code]
INNER JOIN [dbo].[person] ON [t1].[PersonID]= [dbo].[Person].PersonID
WHERE ([t0].[codetype] = 'phone') AND (
([t0].[CodeDescription] = 'Home') AND ([t1].[PhoneNum] = '111')
OR
([t0].[CodeDescription] = 'Work') AND ([t1].[PhoneNum] = '222') )
GROUP BY [t1].[PersonID] HAVING COUNT(DISTINCT([t1].[PhoneNum]))=2
我制作的LINQ大致如下:
var ids = context.Code.Where(predicate);
var rs = from r in ids
group r by new { r.phonenumbers.person.PersonID} into g
let matchcount=g.Select(p => p.phonenumbers.PhoneNum).Distinct().Count()
where matchcount ==2
select new
{
personid = g.Key
};
不幸的是,上面的LINQ没有生成正确的结果,实际上在内部生成了如下所示的SQL。顺便说一句,由于计数的原因,这个生成的查询也读取了所有行(大约19592040)大约2次:(这也是一个大的性能问题。请帮助/为我指出正确的方向
Declare @p0 VarChar(10)='phone'
Declare @p1 VarChar(10)='Home'
Declare @p2 VarChar(10)='111'
Declare @p3 VarChar(10)='Work'
Declare @p4 VarChar(10)='222'
Declare @p5 VarChar(10)='2'
SELECT [t9].[PersonID], (
SELECT COUNT(*)
FROM (
SELECT DISTINCT [t13].[PhoneNum]
FROM [dbo].[Code] AS [t10]
INNER JOIN [dbo].[phonenumbers] AS [t11] ON [t11].[PhoneType] = [t10].[Code]
INNER JOIN [dbo].[Person] AS [t12] ON [t12].[PersonID] = [t11].[PersonID]
INNER JOIN [dbo].[phonenumbers] AS [t13] ON [t13].[PhoneType] = [t10].[Code]
WHERE ([t9].[PersonID] = [t12].[PersonID]) AND ([t10].[codetype] = @p0) AND ((([t10].[codetype] = @p1) AND ([t11].[PhoneNum] = @p2)) OR (([t10].[codetype] = @p3) AND ([t11].[PhoneNum] = @p4)))
) AS [t14]
) AS [cnt]
FROM (
SELECT [t3].[PersonID], (
SELECT COUNT(*)
FROM (
SELECT DISTINCT [t7].[PhoneNum]
FROM [dbo].[Code] AS [t4]
INNER JOIN [dbo].[phonenumbers] AS [t5] ON [t5].[PhoneType] = [t4].[Code]
INNER JOIN [dbo].[Person] AS [t6] ON [t6].[PersonID] = [t5].[PersonID]
INNER JOIN [dbo].[phonenumbers] AS [t7] ON [t7].[PhoneType] = [t4].[Code]
WHERE ([t3].[PersonID] = [t6].[PersonID]) AND ([t4].[codetype] = @p0) AND ((([t4].[codetype] = @p1) AND ([t5].[PhoneNum] = @p2)) OR (([t4].[codetype] = @p3) AND ([t5].[PhoneNum] = @p4)))
) AS [t8]
) AS [value]
FROM (
SELECT [t2].[PersonID]
FROM [dbo].[Code] AS [t0]
INNER JOIN [dbo].[phonenumbers] AS [t1] ON [t1].[PhoneType] = [t0].[Code]
INNER JOIN [dbo].[Person] AS [t2] ON [t2].[PersonID] = [t1].[PersonID]
WHERE ([t0].[codetype] = @p0) AND ((([t0].[codetype] = @p1) AND ([t1].[PhoneNum] = @p2)) OR (([t0].[codetype] = @p3) AND ([t1].[PhoneNum] = @p4)))
GROUP BY [t2].[PersonID]
) AS [t3]
) AS [t9]
WHERE [t9].[value] = @p5
谢谢!我想问题可能是
新的{r.phonenumbers.person.PersonID}
为什么你要在这里新建一个新对象,而不是直接按r.phonenumbers.person
分组?每次新建{}都是一个不同的对象,永远不会分组
按人员分组后,我将
选择a组=>新建{person=group.person,phoneNumbers=group.person.phoneNumbers}
,然后检查他们有多少电话号码,然后进行任何最终投影。拖拽!看起来故障在我这边(GIGO原则!)
在我的ORM中,我从右到左创建了关联,而不是相反。我认为这就是问题所在
现在唯一剩下的问题是,不知何故LINQ两次生成一个内部联接,这使最终结果得以正确检索。如果我在生成的sql中对其进行注释,我将得到正确的结果。这是唯一的问题,我想我将为此提出一个新问题。谢谢您的时间!我不知道答案,所以我很抱歉我留下这个评论。你试过使用LinqPad吗?LinqPad是Joseph Albahari的一个免费工具。他有一些你可能感兴趣的文章,例如:g。是的,我有LinqPad。这确实是一个方便的工具。谢谢。哦,我添加了这个工具,因为我自己尝试过按两个字段分组,我想我需要“新的”。后来我删除了第二个字段,但忘记删除新字段。让我试试你说的。