Linq to Entities Как вернуть все записи из Parent? - PullRequest
1 голос
/ 13 февраля 2009

Таблица сотрудников

Employee_ID int
Employee_Name varchar (50)

Таблица продаж:

Sales_ID int
Employee_ID int
Sale_Amount money

Стандартный выбор SQL

Выберите
*
От Сотрудник emp
левое внешнее соединение
Продажи с
на
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.IEnumerable 1 [m12Model.Sales])», и этот метод нельзя преобразовать в выражение хранилища.

Linq to Entites: не поддерживает DefaultIfEmpty ().

Ответы [ 3 ]

2 голосов
/ 13 февраля 2009

Необходимо выполнить левое соединение, используя ключевые слова "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 (), предоставляет значение по умолчанию (ноль) в случаях, когда нет соединения.

0 голосов
/ 25 февраля 2009

Возможно, вы уже нашли решение, но у меня есть предложение, использующее другой подход, чем объединения:

    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

Надеюсь, это поможет вам

0 голосов
/ 13 февраля 2009

Как насчет этого:

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 }

Вместо «выберите новый {emp, sales}» вы можете выбрать нужные столбцы. Это должно быть стандартное левое соединение с использованием LINQ.

...