C# “Linq对实体的影响”;不识别该方法。。。方法,而此方法无法转换为存储表达式。”;

C# “Linq对实体的影响”;不识别该方法。。。方法,而此方法无法转换为存储表达式。”;,c#,database,linq,ado.net-entity-data-model,C#,Database,Linq,Ado.net Entity Data Model,我有个问题。我在VisualStudio中创建了一个数据实体模型。在林克 Guid RtuDataId = db.RtuData.Where(x => x.CommunicationUnit.Id == new Guid(ID)) .OrderByDescending(x => x.ReadOn) .LastOrDefault().Id; 我犯了错误 不识别该方法。。。方法,而此方法无法转换为存储表达式 我在谷歌上搜索过,但我不理解这个错误。它的LastOrDefa

我有个问题。我在VisualStudio中创建了一个数据实体模型。在林克

Guid RtuDataId = db.RtuData.Where(x => x.CommunicationUnit.Id == new Guid(ID))
    .OrderByDescending(x => x.ReadOn)
    .LastOrDefault().Id;
我犯了错误

不识别该方法。。。方法,而此方法无法转换为存储表达式


我在谷歌上搜索过,但我不理解这个错误。

它的
LastOrDefault
在LINQ to Entites中不受支持。我不确定您为什么要使用降序排序,相反,您可以使用排序方式,然后先选择排序方式。如果在查询之前创建新的
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
,这是
LastOrDefault
方法对吗?回答得好,哈比布。但是有一个问题:在查询之前创建新的
Guid
真的有什么不同吗?我之所以问这个问题,是因为据我所知,
Guid
并不是为每个元素实际创建的,而是将整个表达式转换为SQL,并且只创建一次
Guid
。这是正确的,还是我弄错了?@ZacharyKniebel,使用LINQtoEntities,是的,因为它将被转换为SQL,但对于可枚举项,它应该创建一次,然后使用。我只是想稳妥一点。@ZacharyKniebel这完全取决于查询提供程序的实现。它可能会注意到,您正在创建一个始终相同的对象,因此它可以创建一个对象并使用它,它可以找到一种方法将其映射到SQL查询本身,从而使对象创建语法不相关,或者它无法理解对象在上下文中的含义,而只是抛出一个异常。它选择最后一个选项。其他一些查询提供程序可能会选择其中一个,甚至完全执行其他操作。