2011-08-26 4 views
2

으로 변환하십시오. 어떻게이 쿼리를 Linq으로 변환 하시겠습니까?두 개의 열이있는 SQL IN 절을 LINQ

SELECT * 
FROM Test T1 
WHERE (convert(VARCHAR,T1.IdVersFirmFuente) + convert(VARCHAR,T1.IdVersLib)) 
IN 
(
     Select TOP 1 convert(VARCHAR,T2.IdVersFirmFuente) + convert(VARCHAR,T2.IdVersLib) 
     From Test T2 
     Where T2.IdVersFirmFuente = T1.IdVersFirmFuente 
     ORDER BY T2.CodVersion DESC 
) 

그것은이 같은해야한다 :

var Resul = (from u in nDT2.AsEnumerable() 
      where (String.Concat(u.Field<int>("IdVersionLibreria").ToString(),u.Field<int>("IdVersionFirmwareFuente").ToString())) 
        .Contains(
         (from y in nDT2.AsEnumerable() 
         where y.Field<int>("IdVersionFirmwareFuente") == u.Field<int>("IdVersionFirmwareFuente") 
         orderby y.Field<String>("CodVersion") descending 
         select String.Concat(y.Field<int>("IdVersionLibreria").ToString(),y.Field<int>("IdVersionFirmwareFuente").ToString()) 
         ).Take(1)) 
      select u); 
목적은 (많은이있는 경우) 가장 높은 CodVersion 가진 사람들 독특한 "IdVersFirmFuente"을 얻을 수 있습니다

IdVersFirmFuente IdVersLib IdVersion CodVersion 
== 
236    628  628  1.0.0.0 
236    629  629  1.0.0.1 
237    628  628  1.0.0.0 
239    628  628  1.0.0.0 

결과는 다음과 같습니다.

236    629  629  1.0.0.1 
237    628  628  1.0.0.0 
239    628  628  1.0.0.0 

미리 감사드립니다.

답변

4

나는 당신이하는 일이 실제로는 그들보다 조금 복잡하다고 생각합니다. 샘플 데이터로 판단하면 IdVersFirmFuente로 행을 그룹화하고 CodVersion별로 각 그룹을 정렬하고 각 그룹에서 첫 번째 요소를 선택하기 만하면됩니다. 다음과 같은 내용 :

class Program 
{ 
    public class Row 
    { 
     public int IdVersFirmFuente { get; set; } 
     public int IdVersLib { get; set; } 
     public int IdVersion { get; set; } 
     public string CodVersion { get; set; } 
    } 

    static void Main() 
    { 
     var data = new[] 
         { 
          new Row { IdVersFirmFuente = 236, IdVersLib = 628, IdVersion = 628, CodVersion = "1.0.0.0" }, 
          new Row { IdVersFirmFuente = 236, IdVersLib = 629, IdVersion = 629, CodVersion = "1.0.0.1" }, 
          new Row { IdVersFirmFuente = 237, IdVersLib = 628, IdVersion = 628, CodVersion = "1.0.0.0" }, 
          new Row { IdVersFirmFuente = 239, IdVersLib = 628, IdVersion = 628, CodVersion = "1.0.0.0" } 
         }; 

     var result = from u in data 
        group u by u.IdVersFirmFuente into g 
        select g.OrderByDescending(e => e.CodVersion).First(); 

     foreach (var row in result) 
     { 
      Console.WriteLine("{0,-5}{1,-5}{2,-5}{3,-10}", row.IdVersFirmFuente, row.IdVersLib, row.IdVersion, row.CodVersion); 
     } 
    } 
} 
+0

감사합니다. 괜찮 았어. var 대답은 nDT2.AsEnumerable()에서 그룹 u에 의해 u로 u를 입력하십시오 에 ("IdVersionFirmwareFuente")로 g.OrderByDescending (e => e.Field ("CodVersion"))을 선택하십시오. – GoRoS

+0

내가 도와 줘서 다행이다 :) – andriys

관련 문제