错误:LINQ to Entities无法识别方法'System.String ToString(System.Object)'方法在字符串转换时发生

时间:2015-09-01 10:09:24

标签: c# linq entity-framework-6

我有一个实体框架的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 ,但我需要针对此问题的解决方案或解决方法。

请帮我修好。

提前致谢。

2 个答案:

答案 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);

现在没有错误发生,代码正常运行。