我有一个实体框架的EDMX生成类。
public partial class Contact : EntityBase
{
public Contact()
{
}
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string NickName { get; set; }
public Nullable<System.DateTime> DOB { get; set; }
}
我有一个LINQ表达式,用于搜索所有上述属性的文本。
Expression<Func<Contact, bool>> cntExpression = p => p.LastName.ToLower().Trim().Contains(searchedText) ||
p.FirstName.ToLower().Trim().Contains(searchedText) ||
p.MiddleName.ToLower().Trim().Contains(searchedText) ||
p.NickName.ToLower().Trim().Contains(searchedText) ||
(p.DOB.HasValue && p.DOB.Value.ToShortDateString().ToLower().Trim().Contains(searchedText));
'searchingText'是一个包含必须匹配的文本值的变量。
我现在使用业务逻辑类的方法使用上面的LINQ表达式来过滤记录。
IQueryable<Contact> qryContact = _cntMgr.GetFiltered(cntExpression);
直到此处代码被执行,但是在循环通过上述IQueryable结果中存在的Contact记录时会抛出错误。
foreach (var contact in qryContact)
{
if (contact!=null)
{
// Some code executes 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 ,但我需要针对此问题的解决方案或解决方法。
请帮我修好。
提前致谢。
答案 0 :(得分:2)
您的问题与您拥有的ToShortDateString
电话有关。摆脱它的一种方法是在创建表达式之前检查searchText以查找潜在的日期字符串,然后使用日期。
Expression<Func<Contact, bool>> cntExpression;
var searchDate = default(DateTime);
if (DateTime.TryParse(searchText.Trim(), out searchDate))
{
cntExpression = p => p.DOB.HasValue && p.DOB == searchDate;
}
else
{
cntExpression = p => p.LastName.ToLower().Trim().Contains(searchedText) ||
p.FirstName.ToLower().Trim().Contains(searchedText) ||
p.MiddleName.ToLower().Trim().Contains(searchedText) ||
p.NickName.ToLower().Trim().Contains(searchedText);
}
答案 1 :(得分:0)
我通过将表达式更改为:
来解决此问题 Expression<Func<Contact, bool>> cntExpression = p => p.LastName.ToLower().Trim().Contains(searchedText) ||
p.FirstName.ToLower().Trim().Contains(searchedText) ||
p.MiddleName.ToLower().Trim().Contains(searchedText) ||
p.NickName.ToLower().Trim().Contains(searchedText) ||
p.DriversLicenseNumber.ToLower().Trim().Contains(searchedText) ||
(p.FirstName + " " + p.LastName).ToLower().Trim().Contains(searchedText);
var searchDate = default(DateTime);
if (DateTime.TryParse(searchedText.Trim(), out searchDate))
cntExpression = cntExpression.And(p => p.DOB.HasValue && p.DOB == searchDate);
现在没有错误发生,代码正常运行。