LINQ to Entities不能识别'System方法.字符串ToString (System.Object

本文关键字:System 方法 字符串 ToString Object Entities to 不能 识别 LINQ | 更新日期: 2023-09-27 18:10:42

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

public partial class Contact : EntityBase
{
    public Contact()
    {
    }
    public Nullable<System.DateTime> DOB { get; set; }
}

我创建了一个LINQ表达式,用于根据DOB使用字符串值"2015-02-21"搜索记录。

 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.

我已经知道那个系统了。字符串ToString不支持Linq到实体,但我需要一个解决方案或解决这个问题的方法。

请帮助我解决这个问题。

LINQ to Entities不能识别'System方法.字符串ToString (System.Object

检查是否为空

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;

我不认为你的转换是必要的,你可以改变你的代码:

Expression<Func<Contact, bool>> cntExpression = p => p.DOB.HasValue && p.DOB.Value.ToShortDateString() == "2015-02-21";

将表达式替换为this就可以了!

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");
相关文章: