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 
} 

Yukarıdaki kodla ilgili bazı sorunlar yaşıyorum ve konu satırındaki hatayı alıyorum. query.ToList() ile satır. İşte yapmaya çalışıyorum:"Sadece istemci üzerinde değerlendirilebilecek bağımsız değişkenler String.Contains yöntemi için desteklenir"

İlk kapalı, özel bir hata sınıfım var, MyErrorClass. Sitemde bir hata oluştuğunda, istisnadan bir MyErrorClass nesnesi yaratıyorum, tüm verileri bu nesnedeki istisnadan saklayın ve bilgileri veritabanına kaydedin.

İzlediğim özel durum özelliklerinden biri, hata iletisidir (ErrorMessage). Kullanıcının ErrorMessage tabanlı hataları filtreleyebileceği veritabanında ayarlanmış bir ErrorFilters tablosum var. "System.Data.SqlClient.SqlException: Zaman aşımı süresi doldu. İşlemin tamamlanmasından önce sunucu zaman aşımı süresi doldu veya sunucu yanıt vermiyor." Diyorsunuz ve bunları yok saymak istiyorsunuz. Sadece "zaman aşımı süresi doldu" olarak ErrorMessage ile veritabanına bir filtre ekleyin ve yoksayılacak şekilde ayarlayın.

Şimdi, yukarıdaki sınıfım hata almaya ve hatanın filtrelenip filtrelenmeyeceğine karar vermeye ayarlı. Hata ile eşleşen ErrorMessage olan tüm filtrelerin bir listesini almaya çalışıyorum.

Bunun kolay bir düzeltme olduğundan eminim, nasıl düzeltileceğini bilmiyorum.

+0

Bu yöntem geçersiz mi, ne yapılması gerekiyor? Eğer hatanın gösterilip gösterilmeyeceğini kontrol etmesi gerekiyorsa, o zaman bir boole döndürmeli ve bir düzeltme bulunmalıdır. Else, soruyu biraz daha iyi açıkla. –

+1

İşlev, hatayla ilgili olmayan pek çok şey yapıyor, tüm bunlar, hatayla eşleşen bir süzgeç listesi almayı denediğim 3 satır. Bilmen gereken her şeyi açıkladım, başka ne merak ediyorsun? –

cevap

0

f.ErrorMessage.Contains(err.ErrorMessage) kullanıyor olmalısınız - sql linq sonra WHERE ErrorFilter.ErrorMessage LIKE %err.ErrorMessage% bu dönüştürmek gerekir. Sahip olduğunuz şekilde sorun, oluşturulan SQL'in, tümce koşullarına uyması için dinamik bir dizeye gereksinim duyması ve dolayısıyla yalnızca istemcide filtrelenebilmesidir.

Tesadüfen, var query = from filter in DataContext.ErrorFilters select filter; hat gerekli değildir ve aynı senin yapabilirsiniz:

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

DÜZENLEME:

Tamam ben şimdi yapmaya çalıştığını görmek, ama değilim linq2sql'de bu mümkün ise emin olun. Bir saklı yordam oluşturmak ErrorFilter nesnelerin dizisine çıkış adresinin datacontext o ekleyebilir ve eşlemesi yapabilirdi:

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

Sonra datacontext yapabileceğiniz:

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

Sorun, ErrorMessage'ı temel alarak filtrelemenin çok zor olacağıdır. ErrorMessage genellikle çok uzun ve sadece "zaman aşımı süresi doldu" yazarak bir filtre oluşturabilmeniz gerekir. Yönteminizi kullanarak, kullanıcının filtreye ilişkin ErrorMessage öğesinin hataya ilişkin ErrorMessage ile tam olarak aynı olması gerekir. –

+0

Hayır, açıkladığınız gibi çalışmalı, sorgu SELECT * FROM ErrorFilters WHERE ErrorMessage LIKE% someString% gibi bir şey olacaktır. Sorunu yanlış anlamadığım sürece ... – Lee

+0

Invert 'f.ErrorMessage.Contains (err.ErrorMessage))' '' err.ErrorMessage.Contains (f.ErrorMessage)) ' –

4

Hmm. .. Linq2SQL IndexOf çeviri, Contains için daha akıllı görünüyor. "Nerede o" yerine, sadece fazla sordunuz, çünkü bu CHARINDEX kullanır görülebilir LINQPad yılında

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 
} 

"içerir", ancak Sunucu- ile çalışmaktan mutluluk geçerli: Bu çalışması gerekir yan ifadeler.

+1

Bu, kusursuz bir parlaklık. İnsanlar yıllardır buna bir çözüm arıyorlar! .Select (x => "text1 | text2 | text3" .IndexOf (x.column)> = 0) – benpage

+0

@benpage Topluluğun savunmasında, bu yanıtı yayınladıktan sonra not ettim [other] (http: // stackoverflow. com/a/19791382/256431) [places] (http://stackoverflow.com/a/7574433/256431) daha önce bu kavramdan yıllar önce bahsetti. –

İlgili konular