私は、企業と人を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は依然として必要のないものによって注文しようとしています。
「ThenBy」がビジネスの場合(あなたが言及したように)、クエリ自体を変更する必要がないため、このことが最も好きです。 「ThenBy」は結局ネクタイを注文するだけでよいことに注意してください。 –
@DavidSpenceはい。クエリアナライザの出力形式はどのようなものですか? –
申し訳ありません。これは2つのcase文を生成しますが、あなたが言うように、おそらくいくつかの最適化があります。確かめます。 THEN CASE BY ORDER [名前]がNULLではありません[O]。 [O] [名] ELSE [B]。[姓] END、CASE [名前]がNULLではありません[O]。 THEN [名前] ELSE [名前] END –