2009-11-09 21 views
5
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 
} 

Vì vậy, tôi gặp một số vấn đề với mã ở trên và tôi gặp lỗi từ dòng chủ đề tại dòng với query.ToList(). Dưới đây là những gì tôi đang cố gắng làm:"Chỉ các đối số có thể được đánh giá trên máy khách mới được hỗ trợ cho phương thức String.Contains"

Trước hết, tôi có một lớp lỗi tùy chỉnh, MyErrorClass. Bất cứ khi nào xảy ra lỗi trên trang web của tôi, tôi tạo đối tượng MyErrorClass từ ngoại lệ, lưu trữ tất cả dữ liệu từ ngoại lệ trong đối tượng đó và lưu trữ thông tin trong cơ sở dữ liệu.

Một trong những thuộc tính ngoại lệ mà tôi theo dõi là thông báo lỗi (ErrorMessage). Tôi có một bảng ErrorFilters được thiết lập trong cơ sở dữ liệu nơi người dùng có thể lọc lỗi dựa trên số ErrorMessage. Vì vậy, nói rằng bạn đang nhận được một tấn lỗi nói rằng "System.Data.SqlClient.SqlException: Timeout hết hạn. Thời gian chờ hết hạn trước khi hoàn thành hoạt động hoặc máy chủ không đáp ứng.", Và bạn muốn bỏ qua chúng. Bạn chỉ cần thêm một bộ lọc vào cơ sở dữ liệu với ErrorMessage là "hết thời gian chờ" và đặt nó thành bỏ qua.

Bây giờ, lớp của tôi ở trên được đặt để có lỗi và quyết định xem có nên lọc lỗi hay không. Tôi đang cố gắng để có được danh sách tất cả các bộ lọc có số ErrorMessage phù hợp với lỗi đó.

Tôi chắc chắn đây là cách khắc phục dễ dàng, tôi chỉ không biết cách khắc phục.

+0

Phương pháp này sẽ bị hủy, bạn phải làm gì? Nếu nó phải kiểm tra xem lỗi có được hiển thị hay không, thì nó sẽ trả về một boolean và một sửa chữa có thể được tìm thấy. Khác, giải thích câu hỏi tốt hơn một chút. –

+1

Chức năng đang thực hiện rất nhiều thứ khác không liên quan đến lỗi, tất cả những vấn đề đó là 3 dòng mà tôi đang cố gắng lấy danh sách các bộ lọc phù hợp với lỗi. Tôi đã giải thích mọi thứ bạn cần biết, bạn còn thắc mắc gì nữa? –

Trả lời

0

Có vẻ như bạn nên sử dụng f.ErrorMessage.Contains(err.ErrorMessage) - LINQ to sql sau đó sẽ chuyển đổi số này thành WHERE ErrorFilter.ErrorMessage LIKE %err.ErrorMessage%. Vấn đề với cách bạn có nó là SQL được tạo ra sẽ cần một chuỗi động để khớp trong mệnh đề where, và do đó chỉ có thể được lọc trên máy khách.

Ngẫu nhiên, dòng var query = from filter in DataContext.ErrorFilters select filter; là không cần thiết và bạn chỉ có thể làm:

var filters = DataContext.ErrorFilters.Where(f => f.ErrorMessage.Contains(err.ErrorMessage)).ToList();

EDIT:

Ok tôi thấy những gì bạn đang cố gắng để làm gì bây giờ, nhưng tôi không chắc chắn nếu điều này là có thể trong linq2sql. Bạn có thể tạo một thủ tục lưu trữ và thêm rằng để DataContext của bạn và thực hiện ánh xạ từ đầu ra vào một chuỗi các đối tượng ErrorFilter:

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

Sau đó, trong DataContext của bạn, bạn có thể làm:

DataContext 
    .GetMatchingFilters(err.ErrorMessage) 
    .Select(result => new ErrorFilter {...}) 
    .ToList(); 
+0

Vấn đề với điều đó là rất khó để lọc ra dựa trên ErrorMessage. ErrorMessage thường rất dài và bạn có thể tạo bộ lọc bằng cách chỉ cần nhập "hết thời gian chờ". Sử dụng phương pháp của bạn, người dùng sẽ phải có ErrorMessage cho bộ lọc chính xác giống như ErrorMessage cho lỗi. –

+0

Không, nó sẽ hoạt động như bạn mô tả, truy vấn sẽ giống như SELECT * FROM ErrorFilters WHERE ErrorMessage LIKE% someString%. Trừ khi tôi đã hiểu lầm vấn đề ... – Lee

+0

Đảo ngược 'f.ErrorMessage.Contains (err.ErrorMessage))' thành 'err.ErrorMessage.Contains (f.ErrorMessage))' –

4

Hmm. .. Có vẻ như bản dịch của Linq2SQL IndexOf thông minh hơn cho Contains. Điều này sẽ làm việc:

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 
} 

Trong LinqPad nó có thể được nhìn thấy này sử dụng CHARINDEX, bởi vì chúng tôi đã yêu cầu hơn là chỉ "chứa", thay vì "đâu đó", nhưng nó là hạnh phúc để làm việc với Server- biểu thức bên.

+1

Đây là sáng chói thuần túy. Mọi người đã tìm kiếm một giải pháp cho điều này trong nhiều năm !! .Select (x => "text1 | text2 | text3" .IndexOf (x.column)> = 0) – benpage

+0

@benpage Để bảo vệ cộng đồng, sau khi tôi đăng câu trả lời này tôi đã lưu ý [khác] (http: // stackoverflow. com/a/19791382/256431) [địa điểm] (http://stackoverflow.com/a/7574433/256431) về SO đã đề cập đến khái niệm này từ nhiều năm trước. –

Các vấn đề liên quan