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

时间:2019-06-30 13:12:39

标签: c# asp.net-mvc

我开始了一个asp.net mvc项目,我想使用动态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块中,我必须使用每个不为null的参数过滤query,但遇到错误

  

LINQ to Entities不支持指定的类型成员'Date'。

如果我将query的变量定义为List,则可以将ToList()中的Where放在{{1}中的每个if中}与日期时间相关,如下所示,但是在此项目中,由于数据过多,我无法执行此操作:

else

1 个答案:

答案 0 :(得分:2)

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之前或之前(忽略时间部分)。

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