EF связанные объекты не отображаются, когда пусто - PullRequest
0 голосов
/ 09 октября 2019

У меня есть контекст, который связывает два DbSets. Они связаны CustID. Если CustID не существует в связанной таблице, тогда запрос вообще не возвращает запись. Например, у меня есть CustID, показанный в одной сетке, и детали заказа CustID в другой сетке. Если CustID не имеет порядков, столбцы CustID не отображаются в первой сетке.

Здесь я попытался использовать метод DefaultIfEmpty для включения, но это не работает. Я не уверен, как показать, если нет связанных объектов.

var q = from b in _myContext.Customers
            .Where(b => b.Name == "XYZ").Include("OrderDetails")
            select b;


1 Ответ

0 голосов
/ 10 октября 2019

Используйте внутреннее объединение, чтобы убедиться, что возвращенные записи клиента связаны с заказом. Если у клиента нет совпадающих заказов, этот клиент не будет отображаться в результатах.

from customer in myContext.Customers
join order in myContext.OrderDetails on order.CustID equals customer.CustID
select customer;

Используйте левое внешнее объединение, если вы намерены возвращать записи клиентов, даже если они не связаны с какими-либо заказами.

from customer in myContext.Customers
join order in myContext.OrderDetails on order.CustID equals customer.CustID into customerGroup
from record in customerGroup.DefaultIfEmpty(new Customer())
select customer;

В левом внешнем соединении возвращаются все элементы в левой исходной последовательности, даже если в правой последовательности нет соответствующих элементов. Чтобы выполнить левое внешнее объединение в LINQ, используйте метод DefaultIfEmpty в сочетании с групповым соединением, чтобы указать правый элемент по умолчанию, который будет создаваться, если у левого элемента нет совпадений. Вы можете использовать null в качестве значения по умолчанию для любого ссылочного типа или указать пользовательский тип по умолчанию.

Наконец, вы смешиваете Linq и Lambda в своем примере. В качестве лучшей практики вы можете использовать одну или другую;если вы предпочитаете, вот лямбда-эквивалент для примера внутреннего соединения:

myContext.Customers
         .Join(myContext.OrderDetails, 
               customer => customer.CustID, 
               order => order.CustID, 
               (customer, order) => customer);

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...