[英]Convert.ToDateTime in Linq
我想生成像这种类型的SQL语句的LINQ语句
SELECT *
FROM dbo.tbl_Advertisement
WHERE FileName LIKE '%latest%'
AND ToDate = (SELECT min(ToDate)
FROM dbo.tbl_Advertisement
WHERE CAST (getdate() AS DATE) <= CAST (Todate AS DATE)
AND FromDate = (SELECT max(FromDate)
FROM dbo.tbl_Advertisement
WHERE CAST (getdate() AS DATE) >= CAST (FromDate AS DATE)));
我生成了如下的Linq语句:
objAdvList = objAdvList
.Where(x => x.ToDate == Convert.ToDateTime(objAdvList
.Where(y => y.FromDate == Convert.ToDateTime(objAdvList.Max(z => z.FromDate)))
.Select(y => y.FromDate)
))
.Select(x => x)
.ToList();
其中objAdvList是一个List类型的集合
class AdvertisementAccess
{
public DateTime FromDate { get; set; }
public DateTime ToDate { get; set; }
public string FileName { get; set; }
public string Path { get; set; }
}
但是这段代码给我一条错误消息,如下所示:
无法将类型为“ WhereSelectListIterator`2 [AdvertisementAccess,System.DateTime]”的对象转换为类型为“ System.IConvertible”的对象。
有没有人可以解决我的问题?
此致Mayank
内部查询产生一组结果。 但是, Convert.ToDateTime
正在寻找一个值。 您可以使用Single
, First
或Last
从内部查询生成的这组值中选择一个值。
要使用Single
检索内部LINQ查询的唯一结果,请尝试以下代码:
objAdvList = objAdvList
.Where(x => x.ToDate == objAdvList
.Where(y => y.FromDate == Convert.ToDateTime(objAdvList.Max(z => z.FromDate)))
.Select(y => y.FromDate).Single()
)
.ToList();
或者,如果您需要从可能性列表中选择第一个结果,请改用First
:
objAdvList = objAdvList
.Where(x => x.ToDate == objAdvList
.Where(y => y.FromDate == Convert.ToDateTime(objAdvList.Max(z => z.FromDate)))
.Select(y => y.FromDate).First()
)
.ToList();
无论哪种情况,我都删除了.Select(x => x)
表达式,该表达式不执行任何操作。 该表达式将仅选择所有值x
并返回未转换的值。
我还删除了对Convert.ToDateTime
的调用,因为您已经在比较两个日期。 您不需要将日期值转换为日期。
您的第一个Convert.ToDateTime()
调用的参数是一个枚举。 确保使用.FirstOrDefault()
或Single()
作为后缀:
objAdvList = objAdvList
.Where(x => x.ToDate == Convert.ToDateTime(objAdvList
.Where(y => y.FromDate == Convert.ToDateTime(objAdvList.Max(z => z.FromDate)))
.Select(y => y.FromDate)
.FirstOrDefault()
))
.Select(x => x)
.ToList();
使用以下查询代替您的查询。
(objAdvList
.Where(x => x.ToDate == Convert.ToDateTime(objAdvList
.Where(y => y.FromDate == Convert.ToDateTime(objAdvList.Max(z => z.FromDate)))
.Select(y => y.FromDate)
))
.Select(x => x)).Single();
希望这可以帮助。
您的原始查询看起来有些奇怪,但这是通过实体转换为LINQ的样子,我认为:
var objAdvList=objAdvList
.Where(a=>a.Filename.Contains("latest"))
.Where(a=>a.ToDate==objAdvList
.Where(a2=>EntityFunctions.TruncateTime(DateTime.Now)<=EntityFunctions.TruncateTime(a2.FromDate))
.Where(a2=>EntityFunctions.TruncateTime(a2.FromDate)<=objAdvList
.Where(a3=>EntityFunctions.TruncateTime(DateTime.Now)>=EntityFunctions.TruncateTime(a3.FromDate))
.Max(a3=>a3.FromDate))
.Min(a2=>a2.ToDate))
感谢大家的快速有用的回复。 通过使用您的帮助,我生成了我的Linq语句,该语句能够满足我对替换下面给出的sql语句的要求:
SELECT *
FROM dbo.tbl_Advertisement
WHERE ToDate = (SELECT min(ToDate)
FROM dbo.tbl_Advertisement
WHERE FromDate = (SELECT max(FromDate)
FROM dbo.tbl_Advertisement))
我的Linq声明如下:
objAdvList = objAdvList
.Where(x => x.ToDate.Date == objAdvList
.Where(y => y.FromDate.Date == objAdvList.Max(z => z.FromDate.Date))
.Select(y => y.ToDate.Date).Min()
)
.Select(x => x)
.ToList();
再次感谢,Mayank
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.