Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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# 这个LINQ synatx有什么问题?_C#_Sql_Linq_Linq To Sql - Fatal编程技术网

C# 这个LINQ synatx有什么问题?

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

我正在尝试将SQL查询转换为LINQ。不知何故,我的计数(不同的(x))逻辑似乎工作不正常。原始SQL非常有效(或者我认为是这样),但生成的SQL甚至没有返回正确的结果

我正试图修复这个LINQ,使其与原始SQL一样,以一种与原始查询一样高效的方式进行操作。如果我被困在这里,我会非常感激您的帮助:(

SQL正在运行,我需要对以下各项进行可比较的LINQ:

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。这确实是一个方便的工具。谢谢。哦,我添加了这个工具,因为我自己尝试过按两个字段分组,我想我需要“新的”。后来我删除了第二个字段,但忘记删除新字段。让我试试你说的。