Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 如何在c中使用IQueryable在动态查询中搜索日期#_C#_Linq_Iqueryable - Fatal编程技术网

C# 如何在c中使用IQueryable在动态查询中搜索日期#

C# 如何在c中使用IQueryable在动态查询中搜索日期#,c#,linq,iqueryable,C#,Linq,Iqueryable,我需要在sql server数据库表中搜索。我正在使用IQueryable构建一个动态查询,如下所示 var searchTerm=“12/04”; var samuraisQueryable=_context.Samurais.Include(x=>x.Quotes.AsQueryable(); samuraisQueryable=samuraisQueryable.Where(x=>x.Name.Contains(searchTerm)|| x、 CreatedDate.HasValue&&

我需要在sql server数据库表中搜索。我正在使用
IQueryable
构建一个动态查询,如下所示

var searchTerm=“12/04”;
var samuraisQueryable=_context.Samurais.Include(x=>x.Quotes.AsQueryable();
samuraisQueryable=samuraisQueryable.Where(x=>x.Name.Contains(searchTerm)||
x、 CreatedDate.HasValue&&x.CreatedDate.Value.ToString()
.Contains(搜索术语)
var results=samuraisQueryable.ToList();
上面的查询只是一个例子,我的代码中的实际查询是不同的,而且更复杂

武士C看起来像

公共级武士
{
公共武士()
{
Quotes=新列表();
}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共日期时间?CreatedDate{get;set;}
公共列表引号{get;set;}
}
表中的数据如下所示

我没有看到任何结果,因为上面查询中转换的SQL将日期转换为不同的格式(CONVERT(VARCHAR(100),[s].[CreatedDate])。我试图在上面的查询中指定日期格式,但出现了一个错误,
无法转换LINQ表达式

samuraisQueryable=samuraisQueryable.Where(x=>x.Name.Contains(searchTerm)||
x、 CreatedDate.HasValue&&x.CreatedDate.Value.ToString(“dd/MM/yyyy”)
.Contains(搜索术语)
如果(评论)用户希望部分搜索日期,那么老实说:最好的做法是让您的代码检查他们的输入,并将其解析为一个范围查询。因此,如果您看到
“12/04”
,您可以将其解析为一天(在当前年份中,应用您选择的dd/mm vs mm/dd),然后在>=当天和<第二天进行范围查询。类似地,如果您看到
“2021”
,您的代码也应该这样做,但作为范围查询。尝试进行简单的部分匹配不仅计算量大(而且很难作为查询编写):对用户也不是很有用。仅在
“2”上搜索
例如-只是作为“包含”查询没有意义

那么你得到的是:

(var startInc,var endExc)=ParseRange(searchTerm);
samuraisQueryable=samuraisQueryable.Where(
x=>x.CreatedDate>=startInc和&x.CreatedDate
从DateTime对象中删除问号。c#不支持DateTime为null。Queryable将在服务器端求值,因此您无法执行
ToString()。Contains(…)
。您必须首先执行
ToList()
并在客户端求值,或者必须将表达式更改为不使用
Contains()
例如'x.CreatedDate.Value==yourDateTimeObjectHere
。因此,您可能必须首先使用
DateTime.TryParse`来查看它是否是有效日期。@Fred我同意您的看法,但问题是用户将在'12/04'等日期进行部分搜索,而不是'12/04/2021'(我可以解析并进行同等检查)他们希望在这上面有一个过滤器。