Где пункт в LINQ - C # - PullRequest
       18

Где пункт в LINQ - C #

0 голосов
/ 01 марта 2010

У меня есть следующее, которое работает в SQL Query Analyzer .

select oh.*
from order_history oh
join orders o on o.order_id = oh.order_id
where oh.order_id = 20119 and oh.date_inserted = (
    select max(date_inserted) from order_history where order_id = oh.order_id
    group by order_id
)

Как мне перейти на LINQ ? Из тестового кода компилятор пожаловался:

Оператор ошибки '&&' нельзя применить к операндам типа 'int' и 'System.DateTime'

Мой код LINQ:

var query = from ch in cdo.order_histories
    join c in cdo.orders on ch.order_id equals c.order_id
    where (ch.order_id.equals(1234)) &&
    (ch.date_inserted == (cdo.order_histories.Max(p => p.date_inserted)))
    select new OrderData() { };

Обновление: я не использовал '==' для сравнения.

Элемент, оставшийся от моего запроса SQL:

oh.date_inserted = (
select max(date_inserted) from order_history where order_id = oh.order_id
group by order_id)

Как мне это сделать в LINQ?

Ответы [ 3 ]

5 голосов
/ 01 марта 2010

Похоже, что вы пропускаете знак равенства где-то при фильтрации в поле order_id. Вы, вероятно, имеете:

oh.order_id = 20119 && ...

В то время как вы должны иметь:

oh.order_id == 20119 && ...

Обратите внимание на оператор равенства и оператор присваивания. Результатом оператора присваивания является присвоенное значение, поэтому ваша ошибка говорит о том, что вы не можете сравнивать операнды int и System.DateTime.

Я также предполагаю, что у вас есть такая же проблема при проверке со значением date_inserted.

По второй части вашего вопроса вы близки в преобразовании коррелированного подзапроса.

В SQL у вас есть:

oh.date_inserted = (
select max(date_inserted) from order_history where order_id = oh.order_id 
group by order_id)

А в LINQ-to-SQL у вас есть

ch.date_inserted == (cdo.order_histories.Max(p => p.date_inserted))

Вам просто нужно добавить фильтр для order_histories, который использует замыкания для захвата значения order_id в экземпляре ch следующим образом:

ch.date_inserted == (cdo.order_histories.
    Where(ch2 => ch2.order_id == ch.order_id).
    Max(p => p.date_inserted))
1 голос
/ 02 марта 2010

Вы можете перевести SQL в LINQ ... или вы можете написать LINQ для того, что вы хотите.

var result = cdo.order_histories
  .Where(oh => oh.order_id == 20119)
  .OrderByDescending(oh => oh.date_inserted)
  .Take(1)
  .Select(oh => new {history = oh, order = oh.order}
  .Single();
0 голосов
/ 01 марта 2010

Согласен, здесь нужен некоторый код на C #, но не в моей голове - вы используете "==" (оценка) вместо "=" (назначение), верно? C # делает различие здесь, где SQL не делает.

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