为了账号安全,请及时绑定邮箱和手机立即绑定

“LINQ to Entities 不支持指定的类型成员‘Date’”

“LINQ to Entities 不支持指定的类型成员‘Date’”

C#
慕姐8265434 2023-05-14 16:44:50
我开始了一个asp.net mvc项目,我想用 dynamic 过滤来自数据库的请求数据linq/lambda。我的部分代码如下:IQueryable<VehicleMilage> query = null;if (Fr_DeviceId == null && Fr_ContractId == null && From_Date == null && To_Date == null && From_QueryDate == null && To_QueryDate == null){    query = (db.VehicleMilage).OrderBy(x => x.Id).Skip(skip).Take(rows);}else{    query = (db.VehicleMilage);    if (Fr_DeviceId != null)    {        int a = int.Parse(Fr_DeviceId);        query = query.Where(x => x.Fr_DeviceId == a);    }    if (Fr_ContractId != null)    {        int b = int.Parse(Fr_ContractId);        query = query.Where(x => x.Fr_ContractId == b);    }    if (From_Date != null)    {        query = query.Where(x => x.From_Date.Date >= FromDate_ConvertedToDateTime1.Date);    }    if (To_Date != null)    {        query = query.Where(x => x.To_Date.Date <= ToDate_ConvertedToDateTime1.Date);    }    if (From_QueryDate != null)    {        query = query.Where(x => x.CreateDate.Date >= FromQueryDate_ConvertedToDateTime1.Date);    }    if (To_QueryDate != null)    {        query = query.Where(x => x.CreateDate.Date <= ToQueryDate_ConvertedToDateTime1.Date);    }    query = query.OrderBy(x => x.Id).Skip(skip).Take(rows);}我在数据库中的数据至少有 2000000 条记录,我必须将变量定义query 为IQueryable.在块中else,我必须过滤query每个不为 null 的参数,但我遇到了错误LINQ to Entities 不支持指定的类型成员“Date”。query如果我定义as的变量List,那么我可以在其中的每个in 块ToList()之前放入与 datetime 相关的内容,如下所示,但在这个项目中,由于数据量大,我不能这样做:Whereifelsequery = query.ToList().Where(x => x.From_Date.Date >= FromDate_ConvertedToDateTime1.Date);
查看完整描述

1 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

query = query.Where(x => x.From_Date.Date >= FromDate_ConvertedToDateTime1.Date);

可以替换为:


var fromDate = FromDate_ConvertedToDateTime1.Date;

query = query.Where(x => x.From_Date >= fromDate);

它具有相同的逻辑含义,将生成高效的 SQL,并且(最重要的是)它不会遇到您所看到的错误。


对于小于或等于,它稍微复杂一些 - 但并不明显。


query = query.Where(x => x.To_Date.Date <= ToDate_ConvertedToDateTime1.Date);

可以替换为:


var dayAfterToDate = ToDate_ConvertedToDateTime1.Date.AddDays(1)

query = query.Where(x => x.To_Date < dateAfterToDate);

该逻辑乍一看似乎很奇怪 - 但如果它在ToDate 之后的日期之前,在逻辑上等同于在ToDate上或之前(忽略时间组件)。


对其他查询重复相同的过程——它们将遵循完全相同的模式。


查看完整回答
反对 回复 2023-05-14
  • 1 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信