2017-11-11 151 views
1

我创建像比较两个字符串一个简单的搜索:我怎么能比较和SEACH字符串和日期时间C#

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 does not recognize the method 'System.DateTime Parse(System.String)' method, and this method cannot be translated into a store expression.

From this line int count = _db.Count();

我怎么可以做一些字符串之间的比较和日期作为一个字符串输入日期(以不同的格式,如:2017/8/5或05/05/2017或2017-8-5或...)或甚至输入一个数字(搜索所有日期有一个数字)?

回答

2

当LINQ查询被执行,它会得到转换成等价的SQL语句。 DateTime.Parse是将字符串转换为相应的DateTime的C#方法。没有相应的SQL等价物可以这样做。

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

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

如果CreatedTimeDateTime字段,则比较将包括时间戳以及。也就是说,它不会简单地给记录该日期,但日期和具体时间部分

如果你想过滤特定日期的记录(没有时间),你可以使用DbFunctions.TruncateTime helper方法这样做

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

DbFunctions.TruncateTime助手方法内System.Data.Entity命名空间中定义。所以确保你有一个使用声明来使用它。

using System.Data.Entity; 

而且它是安全的使用DateTime.ParseExactTryParseExact的格式,比采用DateTime.Parse

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

你需要做你的查询外的转换:

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