2017-12-18 3 views
4

私は、企業と人を1つの結果で表示しており、一緒に注文したいと考えています。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, 
    }; 

私はレコードがビジネス、他の人の姓と名の場合はONLYビジネス名によってどの注文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] 
END, [person].[LastName] 

は次のとおりです。

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

これは私が書くことができるようにしたいものです(明らかに正しい構文ではありません偽の部分について):

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

申し訳ありません。これは2つのcase文を生成しますが、あなたが言うように、おそらくいくつかの最適化があります。確かめます。 THEN CASE BY ORDER [名前]がNULLではありません[O]。 [O] [名] ELSE [B]。[姓] END、CASE [名前]がNULLではありません[O]。 THEN [名前] ELSE [名前] END –

3

は、このようにコードを変更します。

+0

これは私のコードと同じだと思いますが、ヌルチェックは別の場所にありますか?それはまだビジネスのためにさえ、人の姓による注文を常に含むように見えます。 –

関連する問題