我使用比较字符串创建一个简单的搜索,如:
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或......)来比较字符串和日期,或者甚至是输入一个数字(搜索所有有数字的日期)?
答案 0 :(得分:2)
执行LINQ查询时,它将转换为等效的SQL语句。 DateTime.Parse
是一个C#方法,它将字符串转换为相应的DateTime。没有相应的SQL等效项。
您需要在LINQ查询之前创建一个DateTime对象并使用它。
var d = DateTime.Parse(searchWord);
var result= someEntityCollection.Where(a =>a.CreatedTime==d));
如果CreatedTime
是DateTime
字段,则比较也会包含时间戳。这意味着,它不会简单地给出该日期的记录,而是该日期和特定时间部分
如果您尝试过滤特定日期的记录(没有时间),您可以使用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.ParseExact
或TryParseExact
比使用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);