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を実行し(ステップが0に戻る可能性があるため、そのMyFormの最後のAuditItemレコードでもない限り、1に等しくしたくないため)、最後のレコードのステップを選択して、クエリを実行します。不要な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メソッドとサポートされていない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(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
于 2012-08-13T16:26:55.070 に答える