Linq to Entities无法识别该方法......方法,因此无法将此方法转换为存储表达式。

3

我有一个问题。我在Visual Studio中创建了一个数据实体模型。然后在Linq中使用它;

Guid RtuDataId = db.RtuData.Where(x => x.CommunicationUnit.Id == new Guid(ID))
    .OrderByDescending(x => x.ReadOn)
    .LastOrDefault().Id;

我遇到了错误信息:

不认识方法...方法,无法将此方法转换为存储过程表达式。

我在谷歌上搜索了一下,但是还是不明白这个错误信息的意思。


LastOrDefault 方法对吧? - Habib
1个回答

7

LastOrDefault 在 LINQ to Entities 中不支持。我不确定你为什么在使用 OrderByDescending,可以改用 OrderBy 并选择 First。另外,在查询之前最好创建新的 Guid,然后将其传递给 where 子句,例如:

var guid = new Guid(ID);
Guid RtuDataId = db.RtuData
                   .Where(x => x.CommunicationUnit.Id == guid)
                   .OrderBy(x => x.ReadOn)
                   .FirstOrDefault()
                   .Id;

由于 FirstOrDefault 可能返回 null,所以在访问 Id 之前应该检查是否为 null


很好的回答,Habib。不过我有一个问题:在查询之前创建新的Guid是否真的有任何区别?我问这个问题的原因是因为我的理解是,Guid实际上并不是为每个元素创建的,而是整个表达式被翻译成SQL,Guid只会被创建一次。这是正确的吗,还是我误解了? - Zachary Kniebel
@ZacharyKniebel,使用LINQ to Entities是可以的,因为它会被转换成SQL语句,但对于可枚举对象,最好只创建一次然后多次使用。我只是想在这方面保险起见。 - Habib
@ZacharyKniebel 这完全取决于查询提供程序的实现。它可能会注意到您正在创建一个在整个过程中都相同的对象,因此它可以创建一个并使用它,它可能会找到一种将其映射到SQL查询本身中的方法,以使对象创建语法无关紧要,或者它可能只是不理解上下文中对象的含义,并抛出异常。它选择了最后一种选项。其他一些查询提供程序可能会选择其他选项,甚至完全做其他事情。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接