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();