LINQ嵌套查询问题 - System.NotSupportedException

时间:2015-01-30 19:36:14

标签: c# linq

我正在尝试在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违背了实体框架。

由于

1 个答案:

答案 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,那么你的查询会更容易阅读。