gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:45:33 25 4
gpt4 key购买 nike

我需要在 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(searchTerm)

var results = samuraisQueryable.ToList();
上面的查询只是一个例子,我的代码中的实际查询不同而且更复杂。
Samurai.cs 看起来像
public class Samurai
{

public Samurai()
{
Quotes = new List<Quote>();
}

public int Id { get; set; }
public string Name { get; set; }
public DateTime? CreatedDate { get; set; }
public List<Quote> Quotes { get; set; }
}
表中的数据看起来像
enter image description here
我没有看到任何结果,因为来自上述查询的翻译后的 SQL 将日期转换为不同的格式 (CONVERT(VARCHAR(100), [s].[CreatedDate]))。我试图在上面的查询中指定日期格式,但后来我得到一个错误 The LINQ expression cannot be translated .
samuraisQueryable = samuraisQueryable.Where(x => x.Name.Contains(searchTerm) ||
x.CreatedDate.HasValue && x.CreatedDate.Value.ToString("dd/MM/yyyy")
.Contains(searchTerm)

最佳答案

如果(评论)用户想要部分搜索日期,那么老实说:最好的办法是让您的代码检查他们的输入,并将其解析为范围查询。所以;如果你看到 "12/04" ,您可能会将其解析为一天(在当年,应用您选择的 dd/mm 与 mm/dd),然后在 >= 当天和 < 第二天进行范围查询。同样,如果您看到 "2021" ,你的代码应该做同样的事情,但作为一个范围查询。尝试进行简单的部分匹配不仅计算成本高(并且难以编写为查询):它对用户也不是很有用。正在搜索 "2"例如 - 作为“包含”查询没有意义。
那么你所拥有的是:

(var startInc, var endExc) = ParseRange(searchTerm);
samuraisQueryable = samuraisQueryable.Where(
x => x.CreatedDate >= startInc && x.CreationDate < endExc);

关于c# - 如何在c#中使用IQueryable在动态查询中搜索日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67214234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com