我正在尝试在LINQ中重现以下SQL查询:
select *
from dbo.events_log
where std_datetimeseq < '2014011523:49:00001'
and logname in ('S', 'D', 'O')
and std_datetimeseq = (
select min(std_datetimeseq)
from dbo.events_log
where std_datetimeseq < '2014011523:49:00001'
and logname in ('S', 'D', 'O'))
这就是我所拥有的:
from e in _context.EventLogs
where e.std_datetimeseq.CompareTo(stdDateTimeSeq) < 0
&& eventMessage.Content.EquipToSearch.Contains(e.logname)
&& e.std_datetimeseq.CompareTo(
((from e2 in _context.EventLogs
where e2.std_datetimeseq.CompareTo(stdDateTimeSeq) < 0
&& eventMessage.Content.EquipToSearch.Contains(e2.logname)
select e2).Min().std_datetimeseq)) == 0
select e
我一直得到这个例外:
{"The specified method 'MyEntityModel.EventLog Min[EventLog](System.Linq.IQueryable`1[HDSREntityDataModelNS.EventLog])'
on the type 'System.Linq.Queryable' cannot be translated into
a LINQ to Entities store expression because no overload matches the passed arguments."}
我不知道出了什么问题。
eventMessage.Content.EquipToSearch是一个包含“S”,“D”,“O”的列表。 LINQ违背了实体框架。
由于
答案 0 :(得分:1)
问题在于子查询
(from e2 in _context.EventLogs
where e2.std_datetimeseq.CompareTo(stdDateTimeSeq) < 0
&& eventMessage.Content.EquipToSearch.Contains(e2.logname)
select e2).Min().std_datetimeseq
为了获得最小std_datetimeseq
值,您必须选择它,否则您正在尝试找到最小EventLogs
项目,该项目不仅没有意义,而且无法翻译到EF的SQL。而是执行以下操作。
(from e2 in _context.EventLogs
where e2.std_datetimeseq < stdDateTimeSeq
&& eventMessage.Content.EquipToSearch.Contains(e2.logname)
select e2.std_datetimese).Min()
另外,如果你只是按照Servy的建议使用比较运算符而不是CompareTo
,那么你的查询会更容易阅读。