1

次の POCO があります。

public class TrackToken
{
    [Required, Key]
    public int ID { get; set; }

    [MaxLength( 500 )]
    public string Comment { get; set; }

    [Required]
    public DateTime CreationTime { get; set; }

    public virtual ICollection<TrackLog> Logs { get; set; }
}

public class TrackLog
{
    [Required, Key]
    public int ID { get; set; }

    [Required]
    public TrackToken Parent { get; set; }

    [Required]
    public DateTime Time { get; set; }

    [Required]
    public int ServerID { get; set; }
}

すべての TrackToken を返すことができる EF LINQ クエリを作成し、その TrackToken の最新の TrackLog と結合できるようにしたいと考えています。

次のようなコードを試しました:

TrackTokens
.Select( t => new
{
    ID = t.ID,
    Comment = t.Comment,
    CreationTime = t.CreationTime,

    RecentLog = t.Logs.OrderByDescending( l => l.Time ).FirstOrDefault(),
} );

しかし、クエリを実行する行のどこかで、私は得る

EntityCommandCompilationException: An error occurred while preparing the command definition. See the inner exception for details.

InnerException: NotSupportedException: Specified method is not supported.

これは、FirstOrDefault の使用に関連しているようです。

これに似たものも試しましたが、ServerID列を取得する方法がわかりません

TrackTokens
.Select( t => new
{
    ID = t.ID,
    Comment = t.Comment,
    CreationTime = t.CreationTime,

    LastSeen = t.Logs.Max( l => l.Time ),
    LastServerID = // how do I get the ServerID column of the most recent record?
} );

この種の関係に対してクエリを実行するための頼りになる方法は何ですか?

4

2 に答える 2

1

次を使用して、ステートメントで を取得できLastServerIDます。Select

LastServerID = t.Logs.OrderByDescending(l => l.Time)
    .Select(l => l.ServerID).FirstOrDefault()

(おそらく、 aに何もないSelect(l => (int?)l.ServerID)ケースを考慮するために、戻り値の型を null 可能にする必要があります。おそらく同じです: )TrackTokenTrackLogMax(l => (DateTime?)l.Time)

SQL Server で動作します。ただし、実際の問題は、EF 用の MySQL プロバイダーがプロジェクションをサポートしていないことのようです (こちらFirstOrDefaultにも記載されています)。

于 2013-07-26T16:30:57.647 に答える