1

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

AuditItem 跟踪在 MyForm 上执行的许多操作

我正在展示一个索引页,其中显示了 AuditItem 的最后一步 = 1 的表。

我做了一个 orderby DateOfAction (因为 Step 可以设置为 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.
4

2 回答 2

5

查看支持和不支持的 LINQ 方法列表。

Last()不支持,但是支持First(),因此您可以继续并反转您的排序并使用First()而不是Last().

mf => mf.AuditItems.OrderByDescending(ai => ai.DateOfAction).First().Step == 1);
于 2012-08-13T16:23:04.283 回答
2

您只需按降序排序并获得第一项。

var myFormsAtStep1 =
    context.MyForms.Include("AuditItems").Where(
        mf => mf.AuditItems.OrderByDescending(
            ai => ai.DateOfAction).First().Step == 1);

我还将使用更具可读性的查询语法以及强类型的 Include(导入 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
于 2012-08-13T16:26:55.070 回答