2012-11-15 2 views
2

안녕하세요 저는이 SQL 쿼리 (MSSQL)를 가지고 있습니다. 조인 결과가 나에게 가장 최근 행의 "맨 위"행을 제공하는 쿼리를 수행하고 있습니다. 날짜 결과가 중복되지 않고 여기에서 찾을 수 있습니다. http://goo.gl/Uv0FR이 작업은 이미 SQL 쿼리를 수행 한 것으로 예상대로 작동하고 각 IDKEY에 대해 1 행을 얻습니다. 내가 LINQ에 SQL 변환려고 할 때 문제가LINQ 번역은 내 SQL 쿼리와 동일한 결과를 제공하지 않습니다

Select * from PlazaI pi 
join (
    Select * from PlazaE pe where 
    NOT EXISTS(SELECT 1 FROM PlazaE pe1 
    WHERE pe.Id_plaza = pe1.Id_plaza AND pe1.Fecha > pe.Fecha AND pe1.Fecha < GETDATE() and pe1.Id_Emp != 0) 
) pe on pe.Id_plaza = pieepo.Id_plaza 
join Emp e on pe.Id_Emp = e.Id_Emp 
join View ct on ct.Id_Nodo = pe.id_nodo 
where pi.PlazaIe in ('value1','value2') 

은 그냥 중복없이 절 "의 pi.PlazaIe는 ('', '') 발생을 할 수 없습니다. (I ' Linq 의이 세계에서 새로운)

다음은 내 linq 쿼리입니다.

var q1 = (from pe in db.PlazaEmpleados 
       where !db.PlazaEmpleados.Any 
            (
            pe1 => (pe1.Id_plaza.Equals(pe.Id_plaza) && pe1.Fecha > pe.Fecha && pe1.Id_Emp != 0 && pe1.Fecha > DateTime.Now) 
            ) select pe); 

    var q2 = (from pi in db.Context 
       join pe in (q1) on pi.Id_plaza equals pe.Id_plaza 
       select new EmpVO 
        { 
        Id_Nodo = pe.id_nodo, 
        Id_plaza = pi.PlazaSome, 
        Num_Plaza = pi.Id_plaza, 
        }); 

이 linq2sql 쿼리를 실행할 때 각 값마다 1 대신에 중복 결과가 나타납니다. 그래서, 누군가가 좋은 방법으로 SQL 쿼리를 LINQ Query로 변환 할 수 있는지 또는 오류가 어디에 있는지 알려주고 싶습니다.

미리 감사드립니다.

+0

** [sqltolinq] (http://www.sqltolinq.com/) **을 사용하여 SQL 쿼리를 linq 식으로 변환하십시오. –

+0

내 편집 된 게시물을 확인하십시오. 나는 또 다른 해결책을 추가했다. – CSharpie

답변

1

, 그래서 제가 마지막으로 한 일은 '나는 돈이 최고의 방법이 아닙니다 알과

db.ExecuteQuery<ObjectVO>(sqlQuery); 

을 사용하는 것입니다 t는 왜 내 SQL 쿼리와 내 linq 쿼리가 같은 결과 집합을 얻지 못하는지에 대한 질문을 해결하지만 이전 대답과는 다릅니다.

다른 점은 복잡성 (새로운 비즈니스 로직 요구 사항)에서 성장한 내 쿼리가 7 개의 테이블과 최대 날짜 검색에 참여해야한다는 것입니다. 따라서 이들 중 일부는 이제는 linq에서 SQL로 쿼리를 변환하는 것이 더 복잡합니다. .

감사합니다.

6

날짜에 대한 귀하의 확인이 다릅니다

LINQ :

pe1.Fecha > DateTime.Now 

SQL : 있어야

pe1.Fecha < GETDATE() 

밤은 당신의 LINQ :

pe1.Fecha < DateTime.Now 
+0

+1 황소 눈 ... –

+0

확인 ...이 문제가 해결 된 경우 – ncubica

+0

실제로 "실수"였지만 Linq에서 여전히 중복 행을 가져오고 SQL에서 작업하고 있습니다. 내가 sqltolinq 시도하고 무슨 일이 있었는지 .. – ncubica

0

이 부분 :

var q1 = from pe in db.PlazaEmpleados 
      where !db.PlazaEmpleados.Any 
      (pe1 => 

      pe1.Id_plaza.Equals(pe.Id_plaza) && 
      pe1.Fecha > pe.Fecha && 
      pe1.Id_Emp != 0 && 
      pe1.Fecha < DateTime.Now 
      ) 
      select pe; 

SQL에서는 처음에는 PlazaI, 다음으로 PlazaE- Linq를 사용합니다. 두 경우 모두 PlazaEmpleados를 사용합니다.

+0

메신저로 작업하고 있지만,이 서브 쿼리의 일부는 꽤 좋다고 생각합니다. 메신저가 db.PlazaE (PlazaEmpleados)에서 모든 pe를 얻으려고하기 때문에 PlazaEmpleados 내 코드의 실제 이름입니다 (죄송합니다). 그 부분은 서브 쿼리 NOT EXIST입니다. 내가 잘못 생각하는 것 같아요 ... : ( – ncubica

0

SQL 쿼리를 저장 프로 시저에 추가하여 컨텍스트에 추가하십시오. 그럼 그냥 전화 : 나는 내 문제를 해결하는 답을 찾을 수 없습니다

var q = context.MyProcedure(new object[] {"value1","value2"}); 
+0

당신은 새로운 저장소 프로 시저를 선언하고 쿼리를 실행하는 것을 의미합니까?, 이것은 데이터베이스에 새 저장소 프로 시저를 만들 수 없기 때문에 가능하지 않습니다. 무엇을 의미합니까? – ncubica

+0

이런 종류의, 그냥 사용하는 경우 저장소 프로 시저 linq에서 "원시"쿼리를 사용했습니다. – ncubica

+0

그래, 내가 아는 ... 난 그냥 내 자신의 대답을 올바른 것으로 표시 : @ 늦게 대답 – ncubica

관련 문제