我如何比较和搜索字符串和日期时间c#

时间:2017-11-11 16:22:20

标签: c# asp.net-mvc linq datetime

我使用比较字符串创建一个简单的搜索,如:

articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.Title.Contains(searchWord) }, a => a.ArticleCategory);

工作正常;但我希望在日期时间(日期)搜索,我写了不同的代码:

articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.InsertDate ==DateTime.Parse(searchWord) }, a => a.ArticleCategory);

articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.InsertDate.ToString("yyyyMMdd").Contains(searchWord) }, a => a.ArticleCategory);

给我一​​个错误:

  

LINQ to Entities无法识别方法'System.DateTime   Parse(System.String)'方法,这个方法无法翻译   进入商店表达。

     

从这一行开始int count = _db.Count();

如何通过输入日期作为字符串(以不同的格式,如:2017/8/5或05/05/2017或2017-8-5或......)来比较字符串和日期,或者甚至是输入一个数字(搜索所有有数字的日期)?

2 个答案:

答案 0 :(得分:2)

执行LINQ查询时,它将转换为等效的SQL语句。 DateTime.Parse是一个C#方法,它将字符串转换为相应的DateTime。没有相应的SQL等效项。

您需要在LINQ查询之前创建一个DateTime对象并使用它。

var d = DateTime.Parse(searchWord);
var result= someEntityCollection.Where(a =>a.CreatedTime==d));

如果CreatedTimeDateTime字段,则比较也会包含时间戳。这意味着,它不会简单地给出该日期的记录,而是该日期和特定时间部分

如果您尝试过滤特定日期的记录(没有时间),您可以使用DbFunctions.TruncateTime辅助方法来执行此操作

var d = DateTime.Parse(searchWord);
var result= someEntityCollection.Where(a => 
          DbFunctions.TruncateTime(a.CreatedTime)== DbFunctions.TruncateTime(d.Date))

DbFunctions.TruncateTime帮助器方法在System.Data.Entity命名空间内定义。因此,请确保您使用using语句。

using System.Data.Entity;

同样使用格式DateTime.ParseExactTryParseExact比使用DateTime.Parse

更安全
var d = DateTime.ParseExact(searchWord, "dd/MM/yyyy", CultureInfo.InvariantCulture);

答案 1 :(得分:1)

您需要在查询之外进行转换:

var date=DateTime.Parse(searchWord);
articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.InsertDate ==date }, a => a.ArticleCategory);