C# 如何简化过滤后的iqueryable日期linq表达式?
我尝试在从DB筛选的变量IQueryable Items中筛选日期: 但是我得到一个错误,LINQ表达式无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable、AsAsAsAsyncEnumerable、ToList或ToListSync的调用显式切换到客户端计算 我可以这样重写表达式:C# 如何简化过滤后的iqueryable日期linq表达式?,c#,linq,datetime,filtering,iqueryable,C#,Linq,Datetime,Filtering,Iqueryable,我尝试在从DB筛选的变量IQueryable Items中筛选日期: 但是我得到一个错误,LINQ表达式无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable、AsAsAsAsyncEnumerable、ToList或ToListSync的调用显式切换到客户端计算 我可以这样重写表达式: itemsFiltered = itemsFiltered.Where(i => ( (
itemsFiltered = itemsFiltered.Where(i => (
(
i.Dataout.Value.Day.ToString().Length > 1 ?
i.Dataout.Value.Day.ToString() :
"0" + i.Dataout.Value.Day.ToString()
) + "." + (
i.Dataout.Value.Month.ToString().Length > 1 ?
i.Dataout.Value.Month.ToString() :
"0" + i.Dataout.Value.Month.ToString()
) + "." +
i.Dataout.Value.Year.ToString()).Contains(date));
这很有效,但看起来很糟糕。如何简化
加
问题是:当用户输入11时,它是未知的,如果它表示日期、月份或2011年。
日期是字符串,可以是11或11.11或01.01或11.01.201等等。对于LINQ到EF Core,您可以使用默认字符串转换来转换DateTime的date属性:
itemsFiltered = itemsFiltered.Where(i => i.Dataout.Value.Date.ToString().Contains(date));
如果您需要特定格式,以便搜索匹配显示以方便用户,例如,他们可能搜索11.07,然后在标准转换上使用子字符串,我不确定默认值是否匹配您的区域设置:
itemsFiltered = itemsFiltered.Select(i => new { i, sd = i.Dataout.Value.Date.ToString() }).Where(isd => (isd.sd.Substring(8,2) + "." + isd.sd.Substring(5,2) + "." + isd.sd.Substring(0,4)).Contains(date));
如果您编写var dateToCheck=DateTime.ParseExactdate,dd.MM.yyyy;itemsFiltered=itemsFiltered.where i=>i.Dataout.Value.Day==dateToCheck;什么是日期?为什么要使用Contains而不是==?注意:带有格式参数的字符串无法转换为SQL。@user1672994问题是:当用户输入11时,如果它表示日期、月份或2011年,则它是未知的。您使用的LINQ是什么?它是SQL/EF 6.x/EF Core 2.0/EF Core 2.1/EF Core 3.x的LINQ吗?另外,您正在连接到哪个SQL Server?
itemsFiltered = itemsFiltered.Select(i => new { i, sd = i.Dataout.Value.Date.ToString() }).Where(isd => (isd.sd.Substring(8,2) + "." + isd.sd.Substring(5,2) + "." + isd.sd.Substring(0,4)).Contains(date));