我正在尝试从数据库中获取三列,DecalExpireDate,DecalExpireMonth和DecalExpireYear。基本上,我正在尝试检查它是否有一个以前的到期日期,如果有,我需要获得最新的到期日期,因为它可能有多个先前的到期日期。
var previousExpirationDate = (from d in db.CT_Decals
where d.TankID == decal.TankID
&& d.DecalStatus == "Approved"
&& d.DecalExpireDate == ((from dn in db.CT_Decals
where dn.TankID == decal.TankID
&& dn.DecalStatus == "Approved"
select dn.DecalExpireDate).Max())
select new
{
d.DecalExpireDate,
d.DecalExpireMonth,
d.DecalExpireYear
});
此查询无效,有人可以看到问题吗?我正在通过TankID搜索,状态=已批准,然后我尝试使用max expirationDate。
答案 0 :(得分:1)
这个怎么样
var result = db.CT_Decals.Where(o => o.TankId == decal.TankId && o.DecalStatus == "Approved")
.OrderByDescending(o => o.DecalExpireDate)
.Select(o => new { o.DecalExpireDate,
o.DecalExireMonth,
o.DecalExireYear }).First()
或
var result = (from d in db.CT_Decals
where d.TankID == 1 && d.Status == "Approved"
orderby d.ExpireDate descending
select new { d.DecalExpireDate,
d.DecalExpireMonth,
d.ExpireDate }).First();
答案 1 :(得分:0)
这个max函数的问题无法在你需要的范围内转换为Sql
,所以你可以尝试这样做
var previousExpirationDate = (from d in db.CT_Decals
where d.TankID == decal.TankID
&& d.DecalStatus == "Approved"
&& d.DecalExpireDate == ((from dn in db.CT_Decals
where dn.TankID == decal.TankID
&& dn.DecalStatus == "Approved"
order by dn.DecalExpireDate
select dn.DecalExpireDate).First())
select new
{
d.DecalExpireDate,
d.DecalExpireMonth,
d.DecalExpireYear
});
答案 2 :(得分:0)
虽然Max
可能是您示例中的问题,但找到正确使用它的方法会很好,因为它比排序更快。怎么样:
编辑:此答案仅返回DecalExpireDate <击> 撞击>
<击>var previousExpirationDate = (from d in db.CT_Decals
where d.TankID == decal.TankID
&& d.DecalStatus == "Approved"
select new
{
d.DecalExpireDate,
d.DecalExpireMonth,
d.DecalExpireYear
}).Max(d => d.DecalExpireDate);
对于此版本,您必须进行测试,以确定是否值得对数据库进行额外调用以避免排序:
var latestDate = (from d in db.CT_Decals
where d.TankID == decal.TankID
&& d.DecalStatus == "Approved"
select d.DecalExpireDate).Max();
var previousExpirationDate = (from d in db.CT_Decals
where d.TankID == decal.TankID
&& d.DecalStatus == "Approved"
&& d.DecalExpireDate == latestDate
select new
{
d.DecalExpireDate,
d.DecalExpireMonth,
d.DecalExpireYear
}).First();