2012-03-01 2 views
1

에 대한 I는 folowwing 문이와 내가 LINQ에 해당하고 싶은 : 내가 값을 포함하는 모든 행을 검색하고 있습니다 (기본적T-SQL (케이스로 주문) LINQ

SELECT * 

    FROM People 

    where Name like '%something%' 

    ORDER BY CASE 

    WHEN Name LIKE 'something%' then 1 

    WHEN Name LIKE '%something%' then 2 

    ELSE 3 END 

을 이 경우 '무언가') 그리고 나는 그들을 주문하고있다 : 먼저 그 값으로 시작하는 것들, 그리고 나머지.

LinQ에서이를 수행하는 방법에 대한 아이디어가 있으십니까?

답변

3

다음 해결책을 제시했습니다.

var dc = new EntityContext(); 

var result = dc 
// Condition part 
.People.Where(x => x.Name.IndexOf("Foo") > -1) // This part is translated to like 
// projection part 
.Select(x => new { Person = x, Weight = x.Name.IndexOf("Bar") > -1 ? 1 : (x.Name.IndexOf("Baz") ? 2 : 0)}) 
// Order 
.OrderBy(x => x.Weight) 
// Final projection 
.Select(x => x.Person); 

나는 모든 것이 자체적으로 설명합니다. 먼저 조건에 맞는 것을 선택하고 필요한 무게로 새 물건을 만든 다음 주문하고 마지막으로 필요한 사람들을 데려 오십시오.

+1

아이디어를 제공해 주셔서 감사합니다. 나는 끝냈다 : ** context.People.People (p => p.Name.Contains ('something')) OrderBy (f => f.Name.IndexOf ('something')). ThenBy (f => f.Name.Length) .ToList() ** - – Coco

0

나는 이것을 검증 할 수 없지만, 이것과 같은 것이 작동 할 수도있다. 코드는 확실히 최적화/정리 될 수 있지만, 이론적으로는 제대로 작동 할 수 있습니다.

유일한 질문은 비교할 수있는 대리인의 contains가 Where에서 수행하는 방식을 변환하는지 여부입니다. 따라서 IndexOf 또는 이와 유사한 도구 (예 : Oybek 구현)를 사용해야 할 수도 있습니다.

var queryResult = 
    people 
    .Where(person=>person.name.Contains(@"/something/")) 
    .OrderBy(person=>person.Name, 
     delegate(string name1, string name2) 
     { 
      int result1, result2; 
      if(name1.Contains(@"something/")) result1 = 1; 
      else if(name1.Contains(@"/something/")) result1 = 2; 
      else result1 = 3; 

      if(name2.Contains(@"something/")) result2 = 1; 
      else if(name2.Contains(@"/something/")) result2 = 2; 
      else result2 = 3; 

      return result1.CompareTo(result2); 
     })