Как правильно построить запрос linq к сущностям для получения данных от нескольких сущностей (левый аналог внешнего соединения) - PullRequest
0 голосов
/ 03 февраля 2012

Я пытаюсь использовать WebGrid HtmlHelper для отображения данных нескольких объектов. Источник для WebGrid подготовлен запросом linq: var query = db.Orders.Include(o => o.OrderStatus). Я могу отображать агрегированные данные из двух объектов, и это отлично работает.

Но в другом случае, когда я пытаюсь сделать то же самое, но с другим набором данных, у меня есть проблема, которую я не могу решить.

Запрос моего контроллера:

var query = db.SerNum.Include(o => o.Orders).Include(o => o.Item)

Веб-сетка My View:

@grid.GetHtml(columns: grid.Columns(
grid.Column("Item.Name", "Item Name"),
grid.Column("Price", "Price"),
grid.Column("Order.shpOrderID", "Order ID"),
grid.Column("SellDate", "Date")
))

Когда я отлаживаю свой проект, я получаю сообщение об ошибке.

Невозможно отобразить WebGrid - Item.Name и Order.shpOrderID не существуют

Это потому, что не все SerNum имеют связанную запись в таблицах Order и Item. Может кто-нибудь посоветовать мне, как решить эту проблему?

1 Ответ

1 голос
/ 03 февраля 2012

Я бы предложил использовать DTO, POCO, который не отслеживается и не связан с EF.Этот DTO-объект будет соответствовать данным, необходимым для вашей сетки, и будет называться что-то вроде ProductGridView.Это сделает ваши запросы намного более эффективными. Каждое .Include(), которое вы используете в LINQ, выбирает каждый столбец данных из этой таблицы.Вот простой пример, имейте в виду, я не знаю, как выглядят свойства ваших объектов:

puclic class ProductGridView {
    public string ItemName {get; set;}
    public double Price {get; set;}
    public int OrderId {get; set;}
    public DateTime SellDate {get; set;}
}

Теперь вы можете изменить запрос ссылки следующим образом:

var results = db.SerNum.Include(o => o.Orders).Include(o => o.Item)
              .Select(x => new ProductGridView{
                  ItemName = x.Item.Name,
                  ...Rest Of Mapping...
              }).ToList();

Теперь вы можете вернуть эти результаты в свою таблицу, и она должна работать и будет намного более эффективной.

Вот еще немного информации о DTO: http://rlacovara.blogspot.com/2009/03/what-is-difference-between-dto-and-poco.html

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