Как включить одну конкретную строку из другой таблицы с помощью LINQ to Entities - PullRequest
5 голосов
/ 30 ноября 2011

У меня есть база данных с этими двумя таблицами: Customer и CustomerStatus.CustomerStatus - это так называемая таблица только для чтения.Все изменения статуса клиента приводят к ВСТАВКЕ в эту таблицу.Текущий статус клиента можно найти с помощью CustomerStatus.StatusTimestamp.

. Сейчас я ищу запрос LINQ to entity, который загружает всех клиентов вместе с их текущим статусом.Что-то вроде

.Include("CustomerStatus.OrderByDescending(StatusTimestamp).FirstOrDefault()").

Я не нашел подходящего пути с EF 4.0.

Мой текущий обходной путь очень уродлив и использует 2 этапа:

шаг 1: запрос LINQ, который загружает все статусы (на уровне бизнеса / данных):

var r = from c in db.Customers.Include("CustomerStatus") select c;

шаг 2: получение подходящего статуса от каждого клиента в графическом интерфейсе(в цикле в представлении MVC3):

c.CustomerStatus.OrderByDescending(i => i.StatusTimestamp).FirstOrDefault()

Есть идеи, как это можно сделать непосредственно за один шаг?

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

EF более мощный, чем вы думаете.Он может проецировать на сложные типы в пределах IQueryable (т. Е. В одном попадании в базу данных).Это должно работать:

var data = 
    from c in db.Customers
    select new { 
        Customer = c, 
        LastStatus = c.CustomerStatus  // assuming navigation property set up right
                      .OrderByDescending(s => s.StatusTimestamp)
                      .FirstOrDefault()
    };

Теперь data - это IQueryable<anonymous_type>, и каждый элемент имеет свойство Customer, предоставляющее клиенту, и LastStatus, указывающее статус последней отметки времени, или null если для клиента нет записей о статусе.

Здесь вы также можете использовать именованный тип, для меня просто быстрее набрать его таким образом:).

0 голосов
/ 30 ноября 2011

Я не уверен, как выглядит ваша схема, но как насчет

var query = from c in db.Customers 
            join CustomerStatus s on c.StatusTimestamp = s.StatusTimestamp
            order by s.StatusTimestamp
            select c;
0 голосов
/ 30 ноября 2011

Как то так ??

   var r = (from c in db.Customers.Include("CustomerStatus")
            where c.CustomerStatus.OrderByDescending(i => i.StatusTimestamp)
            select c).FirstOrDefault()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...