2009-05-22 17 views
6

Ben LINQ bir çıkışları öğrenmek için çalışıyorum. Ileti sözdiziminden, yöntem sözdizimine doğru olarak (aşağıdaki tabloda çalışıyor) aşağıdaki sorguyu dönüştürmek istiyorum, ancak doğru olarak göremiyorum. Bunu yapmak için bana doğru yolu gösteren biri var mı?Yöntem sözdizimini sorgulama sözdizimi nasıl dönüştürülür

var logQuery = from entry in xDoc.Descendants("logentry") 
       where (entry.Element("author").Value.ToLower().Contains(matchText) || 
         entry.Element("msg").Value.ToLower().Contains(matchText) || 
         entry.Element("paths").Value.ToLower().Contains(matchText) || 
         entry.Element("revision").Value.ToLower().Contains(matchText)) 
       select new 
       { 
        Revision = entry.Attribute("revision").Value, 
        Author = entry.Element("author").Value, 
        CR = LogFormatter.FormatCR(entry.Element("msg").Value), 
        Date = LogFormatter.FormatDate(entry.Element("date").Value), 
        Message = LogFormatter.FormatComment(entry.Element("msg").Value), 
        ET = LogFormatter.FormatET(entry.Element("msg").Value), 
        MergeFrom = LogFormatter.FormatMergeFrom(entry.Element("msg").Value), 
        MergeTo = LogFormatter.FormatMergeTo(entry.Element("msg").Value) 
       }; 
+1

bilgi için "Derinlik C#" sonradan bölümler şanlı ayrıntılı olarak bu alanı kapsayacak: derleyici

yüzden sadece bu enjekte edip bitirdiniz) önemsiz olmayan durumlar için atlar, . –

+0

C# 3.0 spesifikasyonu internette mevcuttur; Sözdizimsel dönüşüm kurallarını ayrıntılı olarak açıklar. –

cevap

14

Aslında oldukça basittir; için (kelimenin tam anlamıyla)

from entry in A 
where B 

çevirir:

A.Where(entry=>B) 

ve:

select C 

(bizim bağlam olarak bir "giriş" ile) doğrudan çevirir:

.Select(entry=>C) 

(olduğunda hariç

var logQuery = xDoc.Descendants("logentry") 
       .Where(entry=> 
          entry.Element("author").Value.ToLower().Contains(matchText) || 
          entry.Element("msg").Value.ToLower().Contains(matchText) || 
          entry.Element("paths").Value.ToLower().Contains(matchText) || 
          entry.Element("revision").Value.ToLower().Contains(matchText)) 
       .Select(entry=>new 
        { 
         Revision = entry.Attribute("revision").Value, 
         Author = entry.Element("author").Value, 
         CR = LogFormatter.FormatCR(entry.Element("msg").Value), 
         Date = LogFormatter.FormatDate(entry.Element("date").Value), 
         Message = LogFormatter.FormatComment(entry.Element("msg").Value), 
         ET = LogFormatter.FormatET(entry.Element("msg").Value), 
         MergeFrom = LogFormatter.FormatMergeFrom(entry.Element("msg").Value), 
         MergeTo = LogFormatter.FormatMergeTo(entry.Element("msg").Value) 
        }); 
+0

Güzel - hızlı cevap için teşekkürler. Spesifik örneğe bir çözüm yerine prensibi açıklayan güzel ve temiz bir cevap için –

+0

+1. – BitMask777

+1

Bart De Smet uygun bir çeviri yazdı [hile sayfası] (http://bartdesmet.net/blogs/bart/archive/2008/08/30/c-3-0-query-expression-translation-cheat-sheet.aspx) yöntem ve sorgu sözdizimi arasında gitmek. – oillio