1

员工表

Employee_ID int
Employee_Name varchar(50)

销售表:

Sales_ID int
Employee_ID int
Sale_Amount 钱

标准 SQL 选择

Select
*
From Employee emp
left outer join
Sales s
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 Entity

            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 }

您可以选择所需的列,而不是“select new { 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 回答