1

我刚开始使用 linq 套件,我认为它很棒,但我有 2 个问题

我有这个项目集合,可以通过几个条件 a、b、c、d、e(不重要)和 someDate(日期时间)过滤

所以我有一个这样的谓词

var predicate = PredicateBuilder.True<Item>();

if (!string.IsNullOrEmpty(filter))
        {
            predicate = predicate.And(p => p.a.Contains(filter));
            predicate = predicate.Or(p => p.b.Value.Contains(filter));
            predicate = predicate.Or(p => p.c.Value.Contains(filter));
            predicate = predicate.Or(p => p.d.Name.Contains(filter));
            predicate = predicate.Or(p => p.e.Contains(filter));
        }
// Get items depending on previous predicate
        var items= (from item in _context.Items.AsExpandable()
                           select item).Where(predicate).Where(m => m.Active).ToList();

但是当我尝试使用

predicate = predicate.Or(p => p.someDate.ToShortDateString().Contains(filter));

因为我没有使用特定日期进行比较,而是使用不完整的字符串,例如 8/1 或 08/01,可能只是 8 或可能只是年份,所以我无法在日期之间进行操作。

并抛出此错误。

LINQ to Entities does not recognize the method 'System.String ToShortDateString()' method, and this method cannot be translated into a store expression.

我从这个链接中得到,这是因为 linq to entity 无法将日期时间解析为字符串,因为如果不同的文化设置。

即使我使用 ToString("d") 我也不愿意重新开始做这一切。

所以问题是

有谁知道让谓词构建器与 date.tostring().contains() 一起工作的方法????

4

1 回答 1

3

ToShortDateString 是一个 C# 构造,数据库不理解它。只需直接在谓词构建器中比较日期即可。

//use some kind of operator. I chose ==.
//if you are passing a date as a string, you need to parse that date first, then do the comparison.
DateTime filterDate;
if(DateTime.TryParse(filter, out filterDate))
   predicate = predicate.Or(p => p.someDate == filterDate);
//Why would you do the date conversion to a string and see if that date contains another string?
于 2013-08-14T16:49:00.040 回答