LINQ to Entities无法识别方法' System.String ToString(System.Object)'可空字段

时间:2015-09-01 06:05:35

标签: c# linq entity-framework-6

我有一个实体框架的EDMX生成的类具有DOB(出生日期)属性。

public partial class Contact : EntityBase
{
    public Contact()
    {
    }

    public Nullable<System.DateTime> DOB { get; set; }
}

我创建了一个LINQ表达式,用于使用字符串值搜索记录&#34; 2015-02-21&#34;反对DOB。

 Expression<Func<Contact, bool>> cntExpression = p => Convert.ToString(p.DOB).ToLower().Trim().Contains("2015-02-21");

我使用业务逻辑类的方法使用上面的LINQ表达式过滤记录。

IQueryable<Contact> qryContact = _cntMgr.GetFiltered(cntExpression);

但是你可以看到DOB是一个可以为空的属性,所以当下面的代码开始循环遍历上面的IQueryable实例中的记录时,它会抛出错误。

foreach (var contact in qryContact)
            {
                if (contact!=null)
                {
                    // some code gets execute here..
                }
            }

我得到的错误是:

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

我已经知道Linq to Entities不支持System.String ToString,但我需要解决方案或解决此问题的方法。

请帮我解决这个问题。

提前致谢。

3 个答案:

答案 0 :(得分:1)

检查空值

Expression<Func<Contact, bool>> cntExpression = p =>
  p.DOB.HasValue 
  &&  Convert.ToString(p.DOB.Value).ToLower().Trim().Contains("2015-02-21");

改进只是比较DateTime的日期部分。

var want = new DateTime(2015, 2, 21);
Expression<Func<Contact, bool>> cntExpression = p =>
    p.DOB.HasValue && want == p.DOB.Value.Date;

答案 1 :(得分:0)

我认为您不需要转换,您可以将代码更改为:

recur_disciplinas

答案 2 :(得分:0)

将表达式替换为此将起作用!

Expression<Func<Contact, bool>> cntExpression = p => p.DOB.HasValue && p.DOB.Value.Year == Convert.ToInt32("2015") && p.DOB.Value.Month == Convert.ToInt32("02") && p.DOB.Value.Month == Convert.ToInt32("21");

Lemme知道你是否还有任何进一步的问题。