LINQ Lambda:获取子集合的最后一个项目(其中 == )



我有以下内容(我在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

相关内容

最新更新