LINQ中的Where子句 - C#

0 c# linq linq-to-sql

我有以下适用于SQL查询分析器.

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
)
Run Code Online (Sandbox Code Playgroud)

如何转换为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() { };
Run Code Online (Sandbox Code Playgroud)

更新:我没有使用'=='进行比较.

剩下的项目来自我的SQL查询:

oh.date_inserted = (
select max(date_inserted) from order_history where order_id = oh.order_id
group by order_id)
Run Code Online (Sandbox Code Playgroud)

我如何在LINQ中执行此操作?

cas*_*One 5

看起来你在order_id场上过滤时错过了某个等号.你可能有:

oh.order_id = 20119 && ...
Run Code Online (Sandbox Code Playgroud)

应该有:

oh.order_id == 20119 && ...
Run Code Online (Sandbox Code Playgroud)

注意相等运算符与赋值运算符.赋值运算符的结果是已分配的值,这就是您的错误表示无法比较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)
Run Code Online (Sandbox Code Playgroud)

在LINQ-to-SQL中你有

ch.date_inserted == (cdo.order_histories.Max(p => p.date_inserted))
Run Code Online (Sandbox Code Playgroud)

您只需添加过滤器,order_histories利用闭包来捕获实例order_id上的值,ch如下所示:

ch.date_inserted == (cdo.order_histories.
    Where(ch2 => ch2.order_id == ch.order_id).
    Max(p => p.date_inserted))
Run Code Online (Sandbox Code Playgroud)