SQL 쿼리를 LINQ로 변환하려고합니다. 어떻게 든 내 count (distinct (x)) 논리가 제대로 작동하지 않는 것 같습니다. 원래 SQL은 매우 효율적입니다 (또는 생각합니다). 그러나 생성 된 SQL은 올바른 결과를 반환하지 않습니다.이 LINQ synatx에서 잘못된 점은 무엇입니까?
원본 SQL이 수행하는 작업을 수행하기 위해이 LINQ를 수정하려고하며 원본 쿼리가 효율적으로 수행하고 있습니다. 여기에 도움이 정말 내가 여기에 붙어로 :(노력하고 있습니다
SQL을 apreciated 난의 비교 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에 생성됩니다.이 생성 된 쿼리는 약 2 회 정도의 모든 행 (약 19592040)을 읽습니다. 점수에 :(위대한 performan입니다 ce 문제도. 도와주세요/저를 올바른 방향으로 가르쳐주십시오.
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
고마워요!
답을 모른다. 대신이 설명을 남기고있다. LinqPad를 사용해 보셨습니까? http://www.linqpad.net/ LinqPad는 Joseph Albahari의 무료 도구입니다. http://www.albahari.com/ 그가 관심을 가질만한 몇 가지 기사가 있습니다 (예 : http://www.albahari.com/nutshell/speedinguplinqtosql.aspx). – gerryLowry
네, LINQPad 있습니다. 참으로 유용한 도구입니다. 감사. –