Mí de nuevo…
Tengo un Archivo XML que contiene las diferentes categorías que me gustaría consulta para los diferentes atributos.

        <item>      
            <title>Industries</title>      
            <category type="Channel">Automotive</category>      
            <category type="Type">Cars</category>      
            <category type="Token">Article</category>      
            <category type="SpecialToken">News</category>      
            <guid>637f0dd7-57a0-4001-8272-f0fba60feba1</guid>
        </item>

EN SQL que yo iba a escribir algo parecido.

select * from articles where channel = 'Automative' AND type = 'Cars' etc. etc.

¿Cómo puedo lograr esto con linq?
He intentado de la siguiente consulta devuelve null. Si puedo combinar las dos atributos con el «O» el operador || me gustaría conseguir los resultados, pero con el doble de resultados en caso de que un elemento coincide con ambos criterios.

var articleList = (from item in doc.Descendants("item")

                         from _category in item.Elements("category")
                         where _category.Value == valueCboChannel && _category.Attribute("domain").Value == "Channel"
                         && (_category.Value == valueCboSubChannel && _category.Attribute("domain").Value == "SubChannel")

                         select new
                         {

                             Title = item.Element("title").Value,
                             Guid= item.Element("guid").Value,
                             description = item.Element("description").Value,
                             link = item.Element("link").Value
                         }).ToList();

            ListView1.DataSource = articleList;
            ListView1.DataBind();               
InformationsquelleAutor Chris | 2009-02-11

2 Comentarios

  1. 3

    Me gustaría simplificar con un método de extensión para hacer la difícil búsqueda:

    (actualizado 12/02/09 a excluir elementos vacíos)

    static string CategoryValue(this XElement element, string type)
    {
        var category = element.Elements("category").FirstOrDefault(
            c => (string)c.Attribute("type") == type
                && !string.IsNullOrEmpty(c.Value)); //UPDATE HERE
        return category == null ? null : category.Value;
    }
    
    static void Main()
    {
        XDocument doc = XDocument.Parse(xml);
        var qry = from item in doc.Descendants("item")
                  where item.CategoryValue("Channel") == "Automotive"
                  && item.CategoryValue("Type") == "Cars"
                  select item;
        foreach (var node in qry)
        {
            Console.WriteLine(node.Element("guid").Value);
        }
    }
    • Muchas gracias Marc. Ahora funciona. De alguna manera yo no podía entenderlo con la isNullOrEmpty.
  2. 0

    Gracias por la sugerencia, de alguna manera me las arreglé para conseguir que funcione, pero sólo con «.Primera» en el método de extensión.

    El Problema que estoy enfrentando ahora es cómo conseguir que todos los valores donde hay valores NULOS en el archivo xml. Básicamente el xml podría ser como sigue. Así que si yo uso «de Primera», a continuación, por supuesto, el primer vacío va a ser seleccionado, por lo tanto no se muestran.
    Hay una manera de saltarse los valores NULL?

    <item>
        <title>Industries</title>
        <category type="Channel"></category> 
        <category type="Channel">Automotive</category> 
        <category type="Type"></category>     
        <category type="Type">Cars</category>     
        <category type="Token">Article</category>       
        <category type="SpecialToken">News</category>       
        <guid>637f0dd7-57a0-4001-8272-f0fba60feba1</guid>  
    </item>

    Aquí el actual método de extensión

        public static string CategoryValue(this XElement item, string type)
        {
            var category = item.Descendants("category").First(c => (string)c.Attribute("type") == type);
            return category == null ? null : category.Value;
    
        }
    • Voy a actualizar mi respuesta anterior para ilustrar…
    • Por CIERTO, si se utiliza en Primer lugar, usted no necesita la verificación null, como ya se ha lanzado una excepción en caso de que no encuentre uno

Dejar respuesta

Please enter your comment!
Please enter your name here