LINQ - klauzule where a kvantifikator all – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

LINQ - klauzule where a kvantifikator all – .NET – Fórum – Programujte.comLINQ - klauzule where a kvantifikator all – .NET – Fórum – Programujte.com

 

jirkab0
Newbie
23. 4. 2012   #1
-
0
-

dobry den,

Potrebuji pomoci LINQ dotazu vybrat vsechny kurzy, ktere navstevuji vsichni zadani studenti

Trida Student.cs

public class Student
{
    public int Id { get; set; }

    public string Name { get; set; }
}

Muj dotaz, ktery nefunguje

var result = from m in courses
             where m.Student.All(x => x = students)
             select m;

//Cannot implicitly convert type 'cviceni.Student[]' to 'cviceni.Student'



List<Student> studenti = new List<Student>
                {
                    new Student
                    {
                           Id = 1,
                           Name = "Jiri Novak"                                      
                    },
                    new Student
                    {
                           Id = 2,
                           Name = "Tomas Novacek"                                     
                    }, 
                    new Student
                    {
                           Id = 3,
                           Name = "Petr Novy"                                     
                    },       
                };                        
Student[] students = studenti.ToArray();

XML ma tvar:

<courses><course>
      <student id="1" name="Jiri Novak" />
      <student id="2" name="Tomas Novacek" />
      <student id="3" name="Petr Novy" />
</course>
<course>
      <student id="1" name="Jiri Novak" />
      <student id="2" name="Tomas Novacek" />
      <student id="4" name="Jan Tlusty" />
</course>
</courses>
Nahlásit jako SPAM
IP: 89.190.52.–
Evzen+2
Návštěvník
24. 4. 2012   #2
-
0
-

Ahoj Jirko,

já si myslím, že jdeš na to správně. 

Předpokládám, že potřebuješ najít všechny kurzy, kam chodí VŠICHNI studenti, takže pokud na jeden kurz bude chodit jen jeden člověk a druhý ne, tak tento kurz nechceš (tady by stačilo vyměnit All za Any, předpokládám).

Nezapomínej hlavně na to, že když porovnáváš jednotlivé instance mezi sebou, tak opravdu musí být stejné.

Prostě pokud si vytvoříš další instanci studenta, který se bude jmenovat "Jiri Novak" a id bude mít 1, tak už je to jiná instance a pak bys muset porovnávat to, aby se shodovali jména a id a né instance.

/// <summary>
    /// Trida reprezentujici studenta.
    /// </summary>
    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    /// <summary>
    /// Trida reprezentujici kurz.
    /// </summary>
    public class Course
    {
        public string Name { set; get; }
        public List<Student> Students { get; set; }
    }

    /// <summary>
    /// Testovaci balicek dat.
    /// </summary>
    public class DummyData
    {
        /// <summary>
        /// Seznam vsech kurzu.
        /// </summary>
        public List<Course> Courses { set; get; }

        /// <summary>
        /// Konstruktor plnici seznam dummy daty.
        /// </summary>
        public DummyData()
        {
            Course tempCourse;

            Courses = new List<Course>();

            // prvni kurz
            tempCourse = new Course();
            tempCourse.Name = "first course";
            tempCourse.Students = new List<Student>();

            Student student1 = new Student();
            student1.Id = 1;
            student1.Name = "Jiri Novak";

            tempCourse.Students.Add(student1);

            Student student2 = new Student();

            student2 = new Student();
            student2.Id = 2;
            student2.Name = "Tomas Novacek";

            tempCourse.Students.Add(student2);

            Student student3 = new Student();

            student3 = new Student();
            student3.Id = 3;
            student3.Name = "Petr Novy";

            tempCourse.Students.Add(student3);
            Courses.Add(tempCourse);

            // druhy kurz
            tempCourse = new Course();
            tempCourse.Name = "second course";
            tempCourse.Students = new List<Student>();

            tempCourse.Students.Add(student1);
            tempCourse.Students.Add(student2);

            Student student4 = new Student();
            student4.Id = 4;
            student4.Name = "Jan Tlusty";

            tempCourse.Students.Add(student4);
            Courses.Add(tempCourse);
        }
    }

    /// <summary>
    /// Trida programu. Vstupni bod aplikace.
    /// </summary>
    public class Program
    {
        public static void Main(string[] args)
        {
            // vytvorim si dummy data
            DummyData query = new DummyData();

            // vytahnu si instanci studenty s id == 1 a 3
            IEnumerable<Student> students = query.Courses.SelectMany(c => c.Students).Where(s => s.Id == 1 || s.Id == 3).Distinct();

            // vratim kurzy kde aspon jeden student navstevuje
            var any = query.Courses.Where(c => c.Students.Any(s => students.Contains(s)));
            Console.WriteLine("ANY EXAMPLE:");
            foreach (var x in any)
            {
                Console.WriteLine(x.Name);
            }

            // vratim kurzy kde kazdy student navstevuje kazdy kurz
            var all = query.Courses.Where(c => c.Students.All(s => students.Contains(s)));
            Console.WriteLine("ALL EXAMPLE:");
            foreach (var x in all)
            {
                Console.WriteLine(x.Name);
            }
        }
    }

Vystup do konzole:

ANY EXAMPLE:
first course
second course
ALL EXAMPLE:
// nic :)

Snad ti to pomuze ;)

Evžen.

Nahlásit jako SPAM
IP: 193.179.183.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 27 hostů

Podobná vlákna

LINQ from from — založil liza

LINQ a DB — založil Jirka

LINQ to XML — založil plasmo

C# použití linq — založil Marek

SQL to LINQ — založil jabo

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý