c# - "Only arguments that can be evaluated on the client are supported for the String.Contains method"

标签 c# asp.net linq linq-to-sql

public static void MyFunction(MyErrorClass err)
{
    var query = from filter in DataContext.ErrorFilters select filter;
    query = query.Where(f => err.ErrorMessage.Contains(f.ErrorMessage));
    List<ErrorFilter> filters = query.ToList();
    //...more code
}

所以我在使用上面的代码时遇到了一些问题,并且我从主题行中的 query.ToList() 行中得到了错误。这是我正在尝试做的事情:

首先,我有一个自定义错误类 MyErrorClass。每当我的网站出现错误时,我都会从异常中创建一个 MyErrorClass 对象,将异常中的所有数据存储在该对象中,并将信息存储在数据库中。

我正在跟踪的异常属性之一是错误消息 (ErrorMessage)。我在数据库中设置了一个 ErrorFilters 表,用户可以在其中根据 ErrorMessage 过滤错误。假设您收到大量错误消息“System.Data.SqlClient.SqlException:超时已过期。在操作完成之前超时时间已过或服务器未响应。”,并且您想忽略它们。您只需向数据库添加一个过滤器,将 ErrorMessage 设置为“超时已过期”,并将其设置为忽略。

现在,我上面的类设置为接受错误,并决定是否应该过滤错误。我正在尝试获取具有与错误匹配的 ErrorMessage 的所有过滤器的列表。

我确信这很容易修复,我只是不知道如何修复它。

最佳答案

嗯...看起来 Linq2SQL IndexOf 翻译比 Contains 更聪明。这应该有效:

public static void MyFunction(MyErrorClass err)
{
    var query = DataContext.ErrorFilters;
    query = query.Where(f => err.ErrorMessage.IndexOf(f.ErrorMessage)>=0);
    List<ErrorFilter> filters = query.ToList();
    //...more code
}

在 LinqPad 中可以看到它使用了 CHARINDEX,因为我们要求的不仅仅是“包含”,而是“它在哪里”,但很高兴与服务器端一起工作表达式。

关于c# - "Only arguments that can be evaluated on the client are supported for the String.Contains method",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1703767/

相关文章:

asp.net - 如何在 MVC 中提供文件而不暴露 URL?

sql - 如何使用 LINQ 查询添加迄今为止的小时数?

c# - 正则表达式操作成本

c# - 如果所有行数据为空隐藏列

c# - 通用字典中的 TKey 和 TValue 是什么?

jquery - 没有表单标签的不引人注目的验证

c# - 如何在 UnitTest asp.net 中使用应用程序变量

c# - 有没有一种聪明的方法来动态调用依赖于类型的扩展方法?

c# - 为什么 LINQ SQL 语法不考虑可空性推断?

c# - 基于 Accept header 的 ASP.NET Core Web API 操作选择