Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何简化过滤后的iqueryable日期linq表达式?_C#_Linq_Datetime_Filtering_Iqueryable - Fatal编程技术网

C# 如何简化过滤后的iqueryable日期linq表达式?

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 => ( (

我尝试在从DB筛选的变量IQueryable Items中筛选日期:

但是我得到一个错误,LINQ表达式无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable、AsAsAsAsyncEnumerable、ToList或ToListSync的调用显式切换到客户端计算

我可以这样重写表达式:

                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));