我有以下适用于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中执行此操作?
看起来你在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)