LINQ - Как я могу гарантировать, что возвращается только одна соответствующая запись, удовлетворяющая определенным критериям? - PullRequest
0 голосов
/ 16 января 2020

Допустим, у меня есть таблица SQL, которая представляет курсы колледжа:

|--------|------------------|------------------|
|  Id    |     StudentId    |     CourseName   |
|--------|------------------|------------------|
|  1     |        15        |    Biology 101   |
|--------|------------------|------------------|
|  2     |        21        |    English 201   |
|--------|------------------|------------------|
|  3     |        38        |    History 301   |
|--------|------------------|------------------|
|  4     |        41        | Anthropology 401 |
|--------|------------------|------------------|
|  5     |        15        |   Graphics 210   |
|--------|------------------|------------------|
|  6     |        21        |  Physics Lab B   |

У нее есть идентификатор студента, который указывает, что этот студент проходит этот курс колледжа. Как видите, учащийся может пройти несколько курсов.

Теперь предположим, что у меня есть список идентификаторов учащихся, например: [15, 21]

Я хочу написать утверждение LINQ, которое даст мне только один курс (он может быть первым, но не обязательным) для каждого студента в моем списке.

Итак, в моем примере я верну курсы 1 и 2. Но это могут быть курсы 2 и 5 или курсы 5 и 6. Это не имеет значения. Мне просто нужно гарантировать, что будет возвращен один и только один курс для каждого идентификатора студента в моем списке. Я также гарантирую, что для студента будет существовать курс.

Если не писать прямо SQL, как бы я это сделал в Entity Framework / LINQ?

1 Ответ

1 голос
/ 16 января 2020

Попробуйте следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataBase db = new DataBase()
            {
                students = new List<Students>() {
                    new Students() { Id = 1, StudentId = 15, CourseName = "Biology 101"},
                    new Students() { Id = 2, StudentId = 21, CourseName = "English 201"},
                    new Students() { Id = 3, StudentId = 38, CourseName = "History 301"},
                    new Students() { Id = 4, StudentId = 41, CourseName = "Anthropology 401"},
                    new Students() { Id = 5, StudentId = 15, CourseName = "Graphics 210"},
                    new Students() { Id = 6, StudentId = 21, CourseName = "Physics Lab B"}
                }
            };

            List<int> searchIds = new List<int>() { 15, 21 };

            List<Students> results = db.students.Where(x =>  searchIds.Contains(x.StudentId))
                .GroupBy(x => x.StudentId)
                .Select(x => x.FirstOrDefault())
                .ToList();

        }
    }
    public class DataBase
    {
        public List<Students> students { get;set;}
    }
    public class Students
    {
        public int Id { get; set; }
        public int StudentId { get; set; }
        public string CourseName { get; set; }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...