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到实体,但我需要一个解决方案或解决这个问题的方法。
请帮助我解决这个问题。
检查是否为空
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");