Может ли кто-нибудь преобразовать следующий синтаксис запроса linq в синтаксис метода, используя лямбду? - PullRequest
0 голосов
/ 17 мая 2018
IList<Student> studentList = new List<Student>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 18, StandardID = 1 } ,
            new Student() { StudentID = 2, StudentName = "Steve",  Age = 21, StandardID = 1 } ,
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 18, StandardID = 2 } ,
            new Student() { StudentID = 4, StudentName = "Ram" , Age = 20, StandardID = 2 } ,
            new Student() { StudentID = 5, StudentName = "Ron" , Age = 21 } 
    };

    IList<Standard> standardList = new List<Standard>() { 
        new Standard(){ StandardID = 1, StandardName="Standard 1"},
        new Standard(){ StandardID = 2, StandardName="Standard 2"},
        new Standard(){ StandardID = 3, StandardName="Standard 3"}
    };

    var studentsWithStandard = from stad in standardList
                       join s in studentList
                       on stad.StandardID equals s.StandardID
                       into sg
                           from std_grp in sg 
                           orderby stad.StandardName, std_grp.StudentName 
                           select new { 
                                            StudentName = std_grp.StudentName, 
                                            StandardName = stad.StandardName 
                            };

foreach (var group in studentsWithStandard)
    {
        Console.WriteLine("{0} is in {1}", group.StudentName, group.StandardName);
    }

Я пытался. мой код следующий.

 var studentsWithStandard  = standardList.GroupJoin(studentList, stand => stand.StandardID, s => s.StandardID,
            (stand, students) => new {StandardName = stand.StandardName, studentGroup = students}).OrderBy(an => an.StandardName);

вывод будет таким:

John is in Standard 1
Steve is in Standard 1
Bill is in Standard 2
Ram is in Standard 2

я получил от http://www.tutorialsteacher.com/codeeditor?cid=cs-JUmITE Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вы можете перевести запрос так:

var ans = standardList.Join(studentList, stad => stad.StandardID, s => s.StandardID, (stad, s) => new { stad, s })
                      .OrderBy(stads => stads.stad.StandardName).ThenBy(stads => stads.s.StudentName)
                      .Select(stads => new { stads.s.StudentName, stads.stad.StandardName });

Обратите внимание, что ответ @ JamesFaix предоставляет более эффективную, менее буквальную версию, сочетающую в себе Join и Select.

На самом деле это версия для понимания запроса без into, которая не нужна для вашего запроса:

var studentsWithStandard = from stad in standardList
                           join s in studentList on stad.StandardID equals s.StandardID
                           orderby stad.StandardName, s.StudentName
                           select new {
                               StudentName = s.StudentName,
                               StandardName = stad.StandardName
                           };

Обратите внимание, что строгий перевод вашего запроса будет включать GroupJoin / SelectMany, но в этом нет необходимости, поскольку вы не пытаетесь выполнить левое соединение:

var ans2 = standardList.GroupJoin(studentList, stad => stad.StandardID, s => s.StandardID, (stad, sg) => new { stad, sg })
                       .SelectMany(stadsg => stadsg.sg.Select(s => new { stadsg.stad, s }))
                       .OrderBy(stads => stads.stad.StandardName).ThenBy(stads => stads.s.StudentName)
                       .Select(stads => new { stads.s.StudentName, stads.stad.StandardName });
0 голосов
/ 17 мая 2018

По моему опыту join - это единственное место, где синтаксис запроса более читабелен, чем лямбда-синтаксис, но независимо ...

Я бы настоятельно рекомендовал прочитать отличную книгу Джона Скита C # In Depth. Главы LINQ дают очень четкое объяснение того, на что переводятся различные синтаксисы запросов. https://www.manning.com/books/c-sharp-in-depth-third-edition

Выражение join, которое имеет только один from, будет преобразовано в метод Join, а не GroupJoin. GroupJoin используется, когда у вас есть два from с до join.

Вы хотите, чтобы это выполняло внутреннее соединение:

standardList
    .Join(studentList,
        stad => stad.StandardID,
        s => s.StandardID,
        (stad, s) => new { Standard = stad, Student = s })
    .OrderBy(x => x.Standard.StandardName)
    .ThenBy(x => x.Student.StudentName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...