Как написать это в Linq? - PullRequest
       3

Как написать это в Linq?

1 голос
/ 02 марта 2011

Я создал сущность с именем CarInfo, но я не уверен, как написать этот SQL в его эквивалентной форме Linq.

SELECT @PartKey = PartKey 
FROM CarInfo
WHERE CarKey = @CarKey
AND RegKey = @RegKey
AND TransactionDate = 
     (SELECT MAX(TransactionDate) 
      FROM CarInfo
      WHERE CarKey = @CarKey
      AND RegKey = @RegKey
      AND TransactionDate <= @TransactionDate)

Ответы [ 4 ]

0 голосов
/ 02 марта 2011

Я знаю, что, вероятно, не следует изменять логику вашего исходного оператора SQL, но похоже, что его целью является предоставление ключа-ключа из ближайшей записи в прошлом или ближайшей к определенной дате.Если это действительно так, я бы рассмотрел следующее:

var result =(from ci in ctxt.CarInfos
            where ci.CarKey == carKey
            && ci.RegKey == regKey
            && ci.TransactionDate <= transactionDate
            orderby ci.TransactionDate descending
            select ci.PartKey)
            .FirstOrDefault();

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

0 голосов
/ 02 марта 2011

Есть некоторые настоящие эксперты Linq, скрывающиеся вокруг этих частей, но это первая попытка, которая действительно должна помочь вам двигаться вперед:

var results = 
    from carInfo in Context.CarInfos 
    where carInfo.CarKey == carKey && carInfo.RegKey == regKey && 
        (carInfo.TransactionDate == (Context.CarInfos.Max(
            (item) => item.CarKey == carKey && item.RegKey == regKey && item.TransactionDate < transactionDate)))
    select carInfo.PartKey
0 голосов
/ 02 марта 2011
    from carInfo in context.CarInfo
    where carInfo.Key == carKey && carInfo.RegKey == regKey                              
&& carInfo.TransactionDate == (from c in carInfo
                              where c.CarKey == carKey && c.RegKey == regKey &&
                              c.TransactionDate <= transactionDate
                              select c.TransactionDate).Max()
    select carInfo.PartKey
0 голосов
/ 02 марта 2011
var query = from c in database.Cars
  where c.CarKey == carKey &&
  c.RegKey == regKey &&
  c.TransactionDate == database.Cars.Where(c => c.CarKey == carKey && c.RegKey == regKey && c.TransactionDate < transactionDate).Max()
  select c.PartKey;

foreach (var key in query)
{
    //Do your work
}

//or
var onlyKey = query.FirstOrDefault();

Где:

  1. database.Cars - ваша таблица, соответственно замените ее на EF или Linq2SQL
  2. regKey, carKey и TransactionsDate - локальная переменная с вашими значениями
  3. Вам необходимо правильно настроить класс автомобиля с EF или Linq2SQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...