2016-03-24 15 views
-3

aşağıdaki kodordinally C# dizeleri karşılaştırmak nasıl/LINQ to SQL

public static List<Value> GetReferenceValueBySourceCode(int lineOfBusiness, State state, ReferenceType referenceType, string sourceCode) { 
      List<Value> referenceValues = new List<Value>(); 

      using (Master database = new Master()) 
      { 
       using (var tx = new System.Transactions.TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted })) 
       { 


        if (referenceType.ExplanationComment == "FILTER") 
        { 

         referenceValues = database.REF_Values 
         .Where(r => r.LOB_code == lineOfBusiness.Code && r.state_ID == state.ID && r.ref_type_id == referenceType.ID && r.source_code.CompareTo(sourceCode) >= 0) 
         .Select(r => new { r.ref_value_id, r.source_code, r.display_order_id, r.screen_display_text, r.external_display_text, r.target_1_code, r.target_2_code, r.legacy_ref_id, r.optional_code_1, r.optional_code_2, r.optional_code_3,r.active_value_indicator }) 
         .AsEnumerable() 
         .Select(r => 
         { 
          ReferenceValue referenceValue = new ReferenceValue(); 
          referenceValue.ID = r.ref_value_id; 
          referenceValue.SourceCode = StringUtility.Trim(r.source_code); 
          referenceValue.DisplayOrder = r.display_order_id; 
          referenceValue.ScreenDisplayText = StringUtility.Trim(r.screen_display_text); 
          referenceValue.ExternalDisplayText = StringUtility.Trim(r.external_display_text); 
          referenceValue.Target1Code = StringUtility.Trim(r.target_1_code); 
          referenceValue.Target2Code = StringUtility.Trim(r.target_2_code); 
          referenceValue.LegacyCode = r.legacy_ref_id; 
          referenceValue.OptionalCode1 = r.optional_code_1; 
          referenceValue.OptionalCode2 = r.optional_code_2; 
          referenceValue.OptionalCode3 = r.optional_code_3; 
          referenceValue.ActiveValueIndicator = r.active_value_indicator; // DD - New Field for Active Coverages 
          return referenceValue; 
         }) 
         .ToList(); 
        } 

ben eşit veya parametre olarak geçirilen oluyor Sourcecode büyükse kayıtları getirmek çalışıyorum var. her ikisi de dize olduğu için çalıştı. ancak sonuçlar 4000 = 400 diyor.

Kaynak kodunu 400 olarak geçiriyorum. Ancak bu kaynak kodu 4000 olarak kabul etmek garip sonuçlar veriyor. Herkesin fikri olabilir mi?

+1

Sorununuzu daha açık bir şekilde açıklayabilir misiniz? Probleminin ne olduğu hakkında hiçbir fikrim yok. – nvoigt

+0

sözlük karşılaştırması mı yoksa ne? "A" mı? ab

+2

'r.source_code.CompareTo (sourceCode)> = 0' –

cevap

1

C# içinde, bulduğunuz gibi >= işlecini dizelerde kullanamazsınız. Derleme yapmaz. Ama String.CompareTo() yöntemi kullanabilirsiniz:

// True if r.source_code is *less than or equal to* sourceCode 
r.source_code.CompareTo(sourceCode) <= 0 

00 daha büyük sol dize büyüktür demektir, bunlar eşit demektir; '0'dan küçük' soldaki dizenin daha az olduğu anlamına gelir.

Ve bu ikinci sorun için bize getiriyor: Sen ilk başta niyet iken, sourceCode == "400" için bu ifadeyi

r.source_code >= sourceCode 

vardı ... "o 400 ve daha az değerlerini göstermesi gerekir." 'un'dan daha az veya sourceCode'a eşit olması için olmasını istiyorsunuz. Ancak,'dan daha büyük veya yazdınız.

String.Compare(r.source_code, sourceCode) <= 0 

... ama Oliver UlmString.CompareTo() Entity Framework ile LINQ to SQL tarafından çevrilmiş ve statik String.Compare() değildir söylüyor:

Orada da statik String.Compare() bu. Eğer öyleyse, eskiyi kullanırdınız. Ama bunun hakkında çelişkili iddialar görüyorum ve kişisel bilgisi yok.

+1

CompareTo, Entity Framework'ü kullanırken SQL'e dönüştürüldüğünü söyleyebilirim. String.Compare'ın da dönüştürüldüğü konusunda emin değilim. Her ikisi de desteklenen btw olarak listelenmiyor, ancak insanlar CompareTo'yu çalıştığı gibi rapor ediyor. –

+0

@OliverUlm Teşekkürler! Bundan bahsedeceğim. –

+0

Ed Plunkett: sonuçlar garip olduğundan bu yana sorumu güncelledim – curiousDev