• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2123
  • Last Modified:

LINQ Subquery

I want make a subquery.

I have the keywords: "ba", "ca", "so" and this code return me all occurrences, but i want only the exactly correspond all the keywords.
List<Estado> listaEstados = new List<Estado>();
               List<Estado> listaEstados2 = new List<Estado>();
 
               XDocument estados = XDocument.Load("XML\\Estados.xml");
 
               string[] strKeywords = texto.ToUpper().Split(' ');
 
               foreach (string strKey in strKeywords)
               {
                   var estadosExp = from estado in estados.Elements("ESTADOS").Elements("ESTADO")
                                    where (string)estado.Attribute("PAIS") == Pais &&
                                    ((string)estado.Attribute("NOMBRE")).ToUpper().IndexOf(strKey.ToUpper()) != -1
                                    orderby (string)estado.Attribute("NOMBRE")
                                    select new
                                    {
                                        Id = estado.Attribute("ESTADO").Value,
                                        Nombre = estado.Attribute("NOMBRE").Value
                                    };
 
                   foreach (var item in estadosExp) listaEstados.Add(new Estado
                   {
                       Id = item.Id,
                       Nombre = item.Nombre
                   });
               }
 
               var x = from est in listaEstados
                       orderby est.Nombre
                       select new
                       {
                           Id = est.Id,
                           Nombre = est.Nombre,
                       };
 
                   foreach (var item in x) listaEstados2.Add(new Estado 
                   {
                       Id = item.Id,
                       Nombre = item.Nombre
                   });
 
               return listaEstados2;

Open in new window

0
paco_espinoza
Asked:
paco_espinoza
  • 3
  • 2
1 Solution
 
Fernando SotoCommented:
Can you post a test XML file and also what you want the results to look like.

Thanks;
Fernando
0
 
paco_espinozaAuthor Commented:
Keywords: "ba", "ca", "su"

actual result:
BAJA CALIFORNIA
BAJA CALIFORNIA SUR
TABASCO
AGUASCALIENTES
MICHOACAN
CAMPECHE
...

desired result:
BAJA CALIFORNIA SUR

then i want the states where the keywords match exactly

<?xml version="1.0" encoding="utf-8" ?>
<ESTADOS>
  <ESTADO PAIS="52" ESTADO="01" NOMBRE="AGUASCALIENTES" EDO1="AGS" INICIO="20000" FIN="20999" />
  <ESTADO PAIS="52" ESTADO="02" NOMBRE="BAJA CALIFORNIA" EDO1="BC" INICIO="21000" FIN="22999" />
  <ESTADO PAIS="52" ESTADO="03" NOMBRE="BAJA CALIFORNIA SUR" EDO1="BCS" INICIO="23000" FIN="23999" />
  <ESTADO PAIS="52" ESTADO="04" NOMBRE="CAMPECHE" EDO1="CAM" INICIO="24000" FIN="24999" />
  <ESTADO PAIS="52" ESTADO="05" NOMBRE="COAHUILA DE ZARAGOZA" EDO1="COA" INICIO="25000" FIN="27999" />
  <ESTADO PAIS="52" ESTADO="06" NOMBRE="COLIMA" EDO1="COL" INICIO="28000" FIN="28999" />
  <ESTADO PAIS="52" ESTADO="07" NOMBRE="CHIAPAS" EDO1="CHS" INICIO="29000" FIN="30999" />
  <ESTADO PAIS="52" ESTADO="08" NOMBRE="CHIHUAHUA" EDO1="CHI" INICIO="31000" FIN="33999" />
  <ESTADO PAIS="52" ESTADO="09" NOMBRE="DISTRITO FEDERAL" EDO1="DF" INICIO="01000" FIN="19999" />
  <ESTADO PAIS="52" ESTADO="10" NOMBRE="DURANGO" EDO1="DGO" INICIO="34000" FIN="35999" />
  <ESTADO PAIS="52" ESTADO="11" NOMBRE="GUANAJUATO" EDO1="GTO" INICIO="36000" FIN="38999" />
  <ESTADO PAIS="52" ESTADO="12" NOMBRE="GUERRERO" EDO1="GRO" INICIO="39000" FIN="41999" />
  <ESTADO PAIS="52" ESTADO="13" NOMBRE="HIDALGO" EDO1="HGO" INICIO="42000" FIN="43999" />
  <ESTADO PAIS="52" ESTADO="14" NOMBRE="JALISCO" EDO1="JAL" INICIO="44000" FIN="49999" />
  <ESTADO PAIS="52" ESTADO="15" NOMBRE="MEXICO" EDO1="MEX" INICIO="50000" FIN="57999" />
  <ESTADO PAIS="52" ESTADO="16" NOMBRE="MICHOACAN" EDO1="MIC" INICIO="58000" FIN="61999" />
  <ESTADO PAIS="52" ESTADO="17" NOMBRE="MORELOS" EDO1="MOR" INICIO="62000" FIN="62999" />
  <ESTADO PAIS="52" ESTADO="18" NOMBRE="NAYARIT" EDO1="NAY" INICIO="63000" FIN="63999" />
  <ESTADO PAIS="52" ESTADO="19" NOMBRE="NUEVO LEON" EDO1="NL" INICIO="64000" FIN="67999" />
  <ESTADO PAIS="52" ESTADO="20" NOMBRE="OAXACA" EDO1="OAX" INICIO="68000" FIN="71999" />
  <ESTADO PAIS="52" ESTADO="21" NOMBRE="PUEBLA" EDO1="PUE" INICIO="72000" FIN="75999" />
  <ESTADO PAIS="52" ESTADO="22" NOMBRE="QUERETARO" EDO1="QRO" INICIO="76000" FIN="76999" />
  <ESTADO PAIS="52" ESTADO="23" NOMBRE="QUINTANA ROO" EDO1="QR" INICIO="77000" FIN="77999" />
  <ESTADO PAIS="52" ESTADO="24" NOMBRE="SAN LUIS POTOSI" EDO1="SLP" INICIO="78000" FIN="79999" />
  <ESTADO PAIS="52" ESTADO="25" NOMBRE="SINALOA" EDO1="SIN" INICIO="80000" FIN="82999" />
  <ESTADO PAIS="52" ESTADO="26" NOMBRE="SONORA" EDO1="SON" INICIO="83000" FIN="85999" />
  <ESTADO PAIS="52" ESTADO="27" NOMBRE="TABASCO" EDO1="TAB" INICIO="86000" FIN="86999" />
  <ESTADO PAIS="52" ESTADO="28" NOMBRE="TAMAULIPAS" EDO1="TAM" INICIO="87000" FIN="89999" />
  <ESTADO PAIS="52" ESTADO="29" NOMBRE="TLAXCALA" EDO1="TLA" INICIO="90000" FIN="90999" />
  <ESTADO PAIS="52" ESTADO="30" NOMBRE="VERACRUZ" EDO1="VER" INICIO="91000" FIN="96999" />
  <ESTADO PAIS="52" ESTADO="31" NOMBRE="YUCATAN" EDO1="YUC" INICIO="97000" FIN="97999" />
  <ESTADO PAIS="52" ESTADO="32" NOMBRE="ZACATECAS" EDO1="ZAC" INICIO="98000" FIN="99999" />
</ESTADOS>

Open in new window

0
 
Fernando SotoCommented:
Hi paco_espinoza;

The code snippet will produce the output data shown below. I followed your code snippet in the question of what you wanted returned.

Fernando



Output of test data
=====================================
ID = 01	Nombre = AGUASCALIENTES
ID = 02	Nombre = BAJA CALIFORNIA
ID = 03	Nombre = BAJA CALIFORNIA SUR
ID = 04	Nombre = CAMPECHE
ID = 16	Nombre = MICHOACAN
ID = 20	Nombre = OAXACA
ID = 27	Nombre = TABASCO
ID = 29	Nombre = TLAXCALA
ID = 31	Nombre = YUCATAN
ID = 32	Nombre = ZACATECAS
 
Code Snippet:
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
 
namespace WindowsFormsApplication20
{
    public partial class Form1 : Form
    {
 
        public class Estado
        {
            public String Id { get; set; }
            public String Nombre { get; set; }
        }
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            List<Estado> estadoList = GetList();
 
            foreach (Estado estado in estadoList)
            {
                Console.WriteLine("ID = {0}\tNombre = {1}", estado.Id, estado.Nombre);
            }
        }
 
        // Test parameters
        String texto = "ba ca su";
        String Pais = "52";
 
        private List<Estado> GetList()
        {
            List<Estado> listaEstados = new List<Estado>();
 
            XDocument estados = XDocument.Load("Estados.xml");
            XElement estadosRoot = estados.Root;
 
            string[] strKeywords = texto.ToUpper().Split(' ');
 
            List<Estado> estadosExp = (from estado in estadosRoot.Descendants("ESTADO")
                                       where estado.Attribute("PAIS").Value == Pais &&
                                       strKeywords.Any(e => estado.Attribute("NOMBRE").Value.IndexOf(e) > -1)
                                       orderby estado.Attribute("NOMBRE").Value
                                       select new Estado
                                       {
                                           Id = estado.Attribute("ESTADO").Value,
                                           Nombre = estado.Attribute("NOMBRE").Value
                                       }).ToList<Estado>();
 
            return estadosExp;
        }
    }
}

Open in new window

0
 
paco_espinozaAuthor Commented:
thank's so much.
0
 
Fernando SotoCommented:
Not a problem, glad I was able to help.  ;=)
0

Featured Post

Prep for the ITIL® Foundation Certification Exam

December’s Course of the Month is now available! Enroll to learn ITIL® Foundation best practices for delivering IT services effectively and efficiently.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now