我有以下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?
} );
在这种关系上执行查询的首选方法是什么?
答案 0 :(得分:1)
您可以使用以下方式在LastServerID
语句中获取Select
LastServerID = t.Logs.OrderByDescending(l => l.Time)
.Select(l => l.ServerID).FirstOrDefault()
(可能你必须使用Select(l => (int?)l.ServerID)
使返回类型为空,才能将案例记入a TrackToken
没有任何TrackLog
的帐户。同样可能是时间: Max(l => (DateTime?)l.Time)
)
它适用于SQL Server。但是,真正的问题似乎是EF的MySQL提供程序在投影中不支持FirstOrDefault
(也提到了here)。
答案 1 :(得分:0)
尝试这样的事情......
using (var context = new YourContext())
{
context.TrackTokens.OrderByDecending(t => t.LastServerID).FirstOrDefault();
}