2017-12-18 23 views
4

나는 하나의 결과에 기업과 사람들을 표시하고 함께 주문하고 싶습니다.조건에 따라 1 식 또는 2 식으로 주문하는 방법은 무엇입니까?

의사 코드 :

if business name is not null 
order by business name 
else 
order by first name then last name 

나는 여러 테이블에 조인 (그리고 잘 작동) 다음과 같이 대략 보이는 구성 LINQ 쿼리가 있습니다.

var query = from x in ... 
    join business in dbContext.Businesses on ... 
    from businesses in bus.DefaultIfEmpty() 
    join person in dbContext.People on ... 
    from people in peo.DefaultIfEmpty() 
    select new Party 
    { 
     person.FirstName, 
     person.LastName, 
     business.Name, 
    }; 

나는 레코드가 비즈니스, 다른 사람의 성과 이름 인 경우에만 사업의 이름으로 된 주문 LINQ 식을 작성하는 방법을 작동하지 않을 수 있습니다. 내가 얻을 수있는 가장 가까운 것은 다음과 같습니다. 항상 사람 성으로 주문하는 것을 포함합니다 (기업의 경우에도). SQL로 변환

var result = 
    whereQuery 
     .OrderBy(x => x.BusinessName != null ? x.BusinessName : x.PersonFirstName) 
     .ThenBy(x => x.PersonLastName); 

:

ORDER BY CASE 
    WHEN [business].[Name] IS NOT NULL 
    THEN [business].[Name] 
    ELSE [person].[FirstName], [person].[LastName] 
END 

이 나는 ​​분명히 (쓸 수 있도록하고 싶습니다 것입니다 올바른 구문되지 않습니다 :

ORDER BY CASE 
    WHEN [business].[Name] IS NOT NULL 
    THEN [business].[Name] 
    ELSE [person].[FirstName] 
END, [person].[LastName] 

내가하고 싶은 것은 허위 부분 용) :

var result = 
     whereQuery 
      .OrderBy(x => x.BusinessName != null ? x.BusinessName : x.PersonFirstName, x.PersonLastName); 

기술적으로 너무 많은 차이점을 만들지는 않습니다. (비즈니스라면 사람 이름과 성이 null이므로 순서가 영향을받지 않아야합니다). 그러나 SQL은 여전히 ​​할 필요가없는 것을 주문하려고합니다.

답변

4
var result = 
    whereQuery 
    .OrderBy(x => x.BusinessName != null ? x.BusinessName : x.PersonFirstName) 
    .ThenBy(x => x.BusinessName != null ? x.BusinessName : x.PersonLastName); 

BusinessName가 null가 아닌 경우 중복 두 번째 순서가있을 수 있습니다 만, 쿼리 분석기 (SQL을 분석 한 후 다음 단계는) 그 중복을 제거 할 수 있어야한다.

var query = from x in ... 
    join business in dbContext.Businesses on ... 
    from businesses in bus.DefaultIfEmpty() 
    join person in dbContext.People on ... 
    from people in peo.DefaultIfEmpty() 
    select new Party 
    { 
     Name = business.Name ?? person.FirstName, 
     person.LastName 
    }; 

var result = whereQuery 
     .OrderBy(x => x.Name) 
     .ThenBy(x => x.PersonLastName); 

선택 이름을하고이 분야에서 다음 종류의, null이 아닌지 확신 할 수 :

+0

'ThenBy'는 기업의 경우에는 (당신이 언급 한 것처럼) 그리고 쿼리 자체를 수정할 필요가 없기 때문에 가장 좋아합니다. 'ThenBy'는 어쨌든 넥타이를 주문하기 만하면됩니다. –

+0

@DavidSpence 예. 쿼리 분석기의 출력 형식은 무엇입니까? –

+0

죄송합니다. 너무 빨리 입력하십시오. 이것은 두 개의 case 문을 생성하지만 여러분이 말했듯이, 아마도 최적화가있을 것입니다. 나는 그것을 조사 할 것이다. CASE BY ORDER [0]. [이름] NULL NOT IS 다음 [0]. [이름] ELSE [B]. [성]을 END는 CASE 는 [0]. [이름] NULL NOT 때 [이름] ELSE [이름] END –

3

은 다음과 같이 코드를 수정합니다.

+0

null 체크가 다른 곳을 제외하고 이것은 내 코드와 동일하다고 생각합니까? 그것은 항상 비즈니스를위한 사람성에 의한 주문을 항상 포함하는 것처럼 보입니다. –