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:超时到期。在操作完成之前超时时间或服务器没有响应。”,并且您想忽略它们。您只需将错误消息为“timeout expired”的过滤器添加到数据库,然后将其设置为忽略即可。

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

我敢肯定这是一个简单的修复程序,我只是不知道如何修复它。

最佳答案

看来您应该使用f.ErrorMessage.Contains(err.ErrorMessage)-linq到sql,然后将其转换为WHERE ErrorFilter.ErrorMessage LIKE %err.ErrorMessage%。使用方法的问题在于,生成的SQL将需要动态字符串来匹配where子句,因此只能在客户端上进行过滤。

顺便说一句,不需要var query = from filter in DataContext.ErrorFilters select filter;行,您可以执行以下操作:
var filters = DataContext.ErrorFilters.Where(f => f.ErrorMessage.Contains(err.ErrorMessage)).ToList();
编辑:

好的,我知道您现在正在尝试做什么,但是我不确定linq2sql是否可行。您可以创建一个存储过程,并将其添加到您的datacontext中,并进行从输出到ErrorFilter对象序列的映射:

create procedure GetMatchingFilters @message varchar(500)
as
begin
    select  *
    from ErrorFilter
    where @message LIKE '%'+ErrorMessage+'%'
end

然后,您可以在数据上下文中执行以下操作:
DataContext
    .GetMatchingFilters(err.ErrorMessage)
    .Select(result => new ErrorFilter {...})
    .ToList();

10-07 15:09