我有以下内容(我在CodeFirst中使用过):
public class MyForm
{
public int MyFormId { get; set; }
//Many Form Properties
public virtual ICollection<AuditItem> AuditItems { get; set; }
}
public class AuditItem
{
public int AuditItemId { get; set; }
public int MyFormId { get; set; }
public IAppUser User { get; set; }
public string ActionByUserStr { get; set; }
public string ActionByUserDisplayName { get; set; }
public DateTime DateOfAction { get; set; }
public string TypeOfAction { get; set; }
public int Step { get; set; }
public virtual MyForm MyForm { get; set; }
}
审核项跟踪在 MyForm 上执行的许多操作
我正在呈现一个索引页,其中 AuditItem 的最后一个步骤 = 1。
我按 DateOfAction 进行排序(因为步骤可能会退缩为 0,所以我不希望它等于 1,除非它也是该 MyForm 的最后一个 AuditItem 记录),然后选择最后一条记录的步骤,然后查询该步骤。 我想尽早查询,这样我就不会拉回不需要的 MyForms 记录。
这是我的查询:
var myFormsAtStep1 =
context.MyForms.Include("AuditItems").Where(
mf => mf.AuditItems.OrderBy(ai => ai.DateOfAction).Last().Step == 1);
它给出了此错误:
LINQ to Entities does not recognize the method 'MyForms.Models.AuditItem Last[AuditItem](System.Collections.Generic.IEnumerable`1[MyForms.Models.AuditItem])' method, and this method cannot be translated into a store expression.
查看支持和不支持的 LINQ 方法列表。
不支持Last()
,但First()
支持,因此您可以继续颠倒顺序并使用First()
而不是Last()
。
mf => mf.AuditItems.OrderByDescending(ai => ai.DateOfAction).First().Step == 1);
您只需按降序排序即可获得第一项。
var myFormsAtStep1 =
context.MyForms.Include("AuditItems").Where(
mf => mf.AuditItems.OrderByDescending(
ai => ai.DateOfAction).First().Step == 1);
我还将使用查询语法,该语法更具可读性,以及强类型的Include(import System.Data.Entity):
from mf in context.MyForms.Include(x => x.AuditItems)
let items = from ai in mf.AuditItems
orderby ai.DateOfAction descending
select ai;
where items.First().Step == 1
select mf