0

次のように、1 対 1 または 0 の関係で 2 つのテーブルがあるとします。

Invoice: ID, Date, OrderID
Order:   ID, Date, Notes (string)

LINQtoSQL に関する限り、次のように INNER JOIN があります。

customer
.invoices
.OrderByDescending(i => i.Date)
.Join(context.Orders,
    invoice => invoice.OrderID,
    order => order.OrderID,
    (invoice, order) => new
    {
        invoice = invoice,
        OrderNotes = order.Notes
    })
.ToList()

内部結合で除外されるすべての値は ですWHERE Invoice.OrderID NOT IN (SELECT OrderID FROM Order)。どうなるかは確認していませんWHERE Invoice.OrderID IS NULL

必要なクエリは次のとおりです。

SELECT i.*, o.Notes AS OrderNotes 
FROM 
    Invoice AS i
LEFT OUTER JOIN 
    Order AS o
ON i.OrderID = o.OrderID

fkを切り替える必要があることは理解していますが、DBの構造を変更する権限がありません。

LEFT OUTER JOIN 効果を生成する方法がわかりません。周りを見回すと、1対多のLEFT JOINの解決策しか見つかりませんでした。

4

3 に答える 3

1

これを試して:

var query = from invoice in context.Invoices
                    join order in context.Orders on new { invoice.OrderId } equals new { order.Id } into groupedJoin
                    from grOrder in groupedJoin.DefaultIfEmpty()
                    select new { Invoice = invoice, Order = grOrder };
于 2012-05-29T10:10:42.273 に答える
1

msdn での優れた例

http://msdn.microsoft.com/en-us/library/bb397895.aspx

このようなものでなければなりません

from i in invoice
join o in order on i.OrderID = o.OrderID into result
from r in result.DefaultIfEmpty()
select new {i.Id, i.someProperty , Notes = (r== null ? String.Empty : r.Notes) };
于 2012-05-29T10:01:51.833 に答える
0

すべての提案のおかげで、メソッドベースの構文でそれを行う方法を理解しました。

customer
.invoices
.OrderByDescending(i => i.Date)
.GroupJoin(context.Orders,
    invoice => invoice.OrderID,
    order => order.OrderID,
    (invoice, orders) => new
    {
        invoice = invoice,
        OrderNotes = orders.SingleOrDefault()==null?"":orders.SingleOrDefault().Notes
    })
.ToList()

キーは GroupJoin ですが、1 対多の関係 JOIN のように見えますが、SQL のように機能します

于 2012-05-30T01:55:20.213 に答える