2009-05-22 11 views
6

Estoy bromeando tratando de aprender los detalles de LINQ. Quiero convertir la siguiente consulta (que funciona correctamente) de la sintaxis de la consulta a la sintaxis del método, pero parece que no puedo hacerlo bien. ¿Alguien puede mostrarme la forma correcta de lograr eso?Cómo convertir la sintaxis de la consulta en la sintaxis del método

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

Para información, los últimos capítulos de "C# en profundidad" cubren esta área lujo de detalles . –

+0

La especificación C# 3.0 está disponible en Internet; describe las reglas de transformación sintáctica en gran detalle. –

Respuesta

14

En realidad es bastante simple;

from entry in A 
where B 

traduce (literalmente) a:

A.Where(entry=>B) 

y:

select C 

se traduce directamente a (con "entrada" como nuestro contexto):

.Select(entry=>C) 

(excepto cuando sería.210, que el compilador omite para los casos no triviales)

por lo que sólo inyectar los y ya está:

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

Bien, gracias por la respuesta rápida. –

+0

+1 para obtener una respuesta clara y agradable que explique el principio en lugar de solo una solución al ejemplo específico. – BitMask777

+1

Bart De Smet escribió una traducción conveniente [hoja de trucos] (http://bartdesmet.net/blogs/bart/archive/2008/08/30/c-3-0-query-expression-translation-cheat-sheet.aspx) ir entre el método y la sintaxis de la consulta. – oillio

Cuestiones relacionadas