2009-06-18 4 views
6

に同等のJOIN:はJOINとLEFTは、私は、次のSQLクエリを使用して働いていますLINQ

SELECT 
a.AppointmentId, 
a.Status, 
a.Type, 
a.Title, 
b.Days, 
d.Description, 
e.FormId 
FROM Appointment a (nolock) 
LEFT JOIN AppointmentFormula b (nolock) 
ON a.AppointmentId = b.AppointmentId and b.RowStatus = 1 
JOIN Type d (nolock) 
ON a.Type = d.TypeId 
LEFT JOIN AppointmentForm e (nolock) 
ON e.AppointmentId = a.AppointmentId 
WHERE a.RowStatus = 1 
AND a.Type = 1 
ORDER BY a.Type 

私はLINQでの結合を達成する方法がわからないと思います。私のテーブルはすべて外部キーの関係になっています。

+1

Linq to SQLを使用していますか? –

答えて

5

私は袖口から出ていたので、これをわずかに微調整しなければならないかもしれませんが、頭に入れておくべき重要なことがいくつかあります。あなたの関係がdbmlに正しく設定されていれば、暗黙のうちに内部結合を行い、初期テーブルを介してデータにアクセスすることができるはずです。また、LINQでの左結合は、期待通りのものではなく、DefaultIfEmpty構文を使用してそれを実現する必要があります。私はここで匿名の型を作成しましたが、DTOクラスやそのようなものに入れることができます。私もnullの場合に何をしたいのか分からなかったが、あなたは?値がnullの場合に変数に与える値を定義する構文。ご不明な点がございましたら、私に教えてください...

var query = (from a in context.Appointment 
join b in context.AppointmentFormula on a.AppointmentId equals b.AppointmentId into temp 
from c in temp.DefaultIfEmpty() 
join d in context.AppointmentForm on a.AppointmentID equals e.AppointmentID into temp2 
from e in temp2.DefaultIfEmpty() 
where a.RowStatus == 1 && c.RowStatus == 1 && a.Type == 1 
select new {a.AppointmentId, a.Status, a.Type, a.Title, c.Days ?? 0, a.Type.Description, e.FormID ?? 0}).OrderBy(a.Type); 
29
SELECT A.X, B.Y 
FROM A JOIN B ON A.X = B.Y 

このLINQのメソッド呼び出しが(参加する)上記の参加が生成されます。

var query = A.Join 
(
    B, 
    a => a.x, 
    b => b.y, 
    (a, b) => new {a.x, b.y} //if you want more columns - add them here. 
); 

SELECT A.X, B.Y 
FROM A LEFT JOIN B ON A.X = B.Y 

(GroupJoin、SelectMany、DefaultIfEmptyに)これらのLINQメソッド呼び出しは、左の上に生成されますここで重要な概念は、LINQのの方法は、階層的形状の結果を生み出すことである

var query = A.GroupJoin 
(
    B, 
    a => a.x, 
    b => b.y, 
    (a, g) => new {a, g} 
).SelectMany 
(
    z => z.g.DefaultIfEmpty(), 
    (z, b) => 
    new { x = z.a.x, y = b.y } //if you want more columns - add them here. 
); 

に参加フラットな行 - 列の形状ではありません。

  • のLINQのGroupByは(空ではないかもしれない)の要素のコレクションに整合グループ化キーを用いて階層に成形結果を生成します。 SQLのGroupBy句では、集計値を持つのグループ化キーが生成されます。作業するサブコレクションはありません。
  • 同様に、LinqのGroupJoinは、子レコードのコレクションに一致する親レコード(空の場合もある)を生成します。 SqlのLEFT JOINは、各子レコードに一致する親レコードを生成します。それ以外の一致がない場合は、NULL子レコードを生成します。 Linqの形状からSqlの形にするには、子レコードのコレクションをSelectManyでアンパックし、子レコードの空のコレクションをDefaultIfEmptyで処理する必要があります。

そして、ここでは、問題のSQL linquifyingでの私の試みです:あなたは(NOLOCK)ヒントを保持したい場合は

var query = 
    from a in Appointment 
    where a.RowStatus == 1 
    where a.Type == 1 
    from b in a.AppointmentFormula.Where(af => af.RowStatus == 1).DefaultIfEmpty() 
    from d in a.TypeRecord //a has a type column and is related to a table named type, disambiguate the names 
    from e in a.AppointmentForm.DefaultIfEmpty() 
    order by a.Type 
    select new { a.AppointmentId, a.Status, a.Type, a.Title, b.Days, d.Description, e.Form } 
+0

[この質問](http://stackoverflow.com/q/12496809/442580)をご覧ください。 – capdragon

1

、私はC#でblogged a handy solution使用して拡張メソッドを持っています。これは、クエリのすべてのテーブルにnolockヒントを追加するのと同じことに注意してください。

関連する問題