1

従業員テーブル

Employee_ID int
Employee_Name varchar(50)

販売テーブル:

Sales_ID int
Employee_ID int
Sale_Amount money

標準 SQL 選択

Select
*
From Employee emp
left outside join
Sales
on
s.Employee_ID = emp.Employee_ID

標準 SQL の結果 (Linq to Entites を使用した正確な結果)

1 Emp1 1 1 150.00
1 Emp1 2 1 500.00
2 Emp2 3 2 250.00
3 Emp3 NULL NULL NULL
4 Emp4 NULL NULL NULL
5 Emp5 4 5 700.00

次に、Linq To Entities に取り組みます

            Dim query = From emp In entiites.Employee _
                    From sales In emp.Sales _
                    Select _
                        emp, _
                        sales

Linq To Entities の結果 (Employee_ID 3 と 4 はどこにありますか)

1: Emp1: 150.0000
1: Emp1: 500.0000
2: Emp2:
250.0000 5: Emp5: 700.0000

左外部結合を使用して、Linq to Entities で試してください。

            Dim query = From emp In entiites.Employee _
                    Group Join sales In entiites.Sales _
                    On emp.Employee_ID Equals sales.Employee.Employee_ID _
                    Into sales_grp = Group _
                    From Sel_SalesGrp In sales_grp.DefaultIfEmpty() _
                    Select _
                        emp, _
                        Sel_SalesGrp

次に、DefaultIfEmpty を使用してこのエラーが発生します。

LINQ to Entities はメソッド 'System.Collections.Generic.IEnumerable 1[m12Model.Sales] DefaultIfEmpty[Sales](System.Collections.Generic.IEnumerable1[m12Model.Sales])' メソッドを認識せず、このメソッドはストア式に変換できません。

Linq to Entites: DefaultIfEmpty() をサポートしていません。

4

3 に答える 3

2

「Into」および「DefaultIfEmpty()」キーワードを使用して左結合を実行する必要があります。

Dim query = From emp In entities.Employee _
        Join sal In entities.Sales On emp.Employee_ID Equals sal.Employee_ID Into LeftJoinSal _
        From ljs In LeftJoinSal.DefaultIfEmpty() _
        Select _
            emp, _
            ljs

このサイトでは、別の簡単な例を示しています: GeeksWithBlogs。それはC#にありますが。

重要なのは、最初のテーブルからの結果がフィルタリングされないように新しい名前に結合する必要があることです (結合しない行を非表示にします)。次に、デフォルトを提供する DefaultIfEmpty() 関数を使用してそこから選択します(null) 結合がない場合の値。

于 2009-02-13T01:56:36.523 に答える
0

これはどう:

Dim query = From emp In entiites.Employee Join sales In In entiites.Sales _
    On emp.Employee_ID Equals sales.Employee_ID select new { emp, sales }

「selectnew{emp、sales}」の代わりに、必要な列を選択できます。これは、LINQを使用した標準の左結合である必要があります。

于 2009-02-13T20:49:56.733 に答える
0

おそらく解決策はすでに見つかっていると思いますが、結合とは異なるアプローチを使用することをお勧めします。

    Dim db As New TestEntities
    Dim EmptySale As Decimal? = Nothing
    Dim Q = (From emp In db.Employee From sale In emp.Sale _
             Select emp.Name, amount =sale.SaleAmount).ToList
    Dim Q2 = (From emp In db.Employee Where Not emp.Sale.Any _
             Select emp.Name, amount = EmptySale)
    Dim Q3 = From emp In Q.Union(Q2) Order By emp.Name, emp.amount

    For Each e In Q3
        Console.WriteLine("{0} {1}", e.Name, e.amount)
    Next

この結果は次のとおりです。

Emp1 150,00
Emp1 500,00
Emp2 250,00
Emp3
Emp4
Emp5 750,00

これがお役に立てば幸いです

于 2009-02-25T19:53:04.720 に答える