LINQ - условное соединение - PullRequest
0 голосов
/ 04 июля 2019

У меня есть условие, когда присоединяющийся стол имеет условие.Допустим, у меня есть таблица с именем Mapper Student Teacher, где Mapper таблица содержит столбец с именем AcNoId, который содержит идентификатор из обеих таблиц Student и Teacher.Структура таблицы:

Mapper Mapper

Ученик Student

Учитель Teacher

TestOption является перечислением и определяется как

public enum TestOption
{
    Teacher = 1,
    Student = 2
}

Теперь у меня есть условие, когда, если TestOption является типом ученика, он должен выполнить объединение с таблицей ученика, и еслитип Учителя, которому следует выполнить соединение с таблицей Учителя. Вот как я пытался до сих пор

(from m in _context.Mapper
                   where m.TestOption == TestOption.Student
                       join s in _context.Student
                       on m.AcNoId equals s.Id into tempStudent
                       from st in tempStudent.DefaultIfEmpty()

                   where m.TestOption == TestOption.Teacher
                       join t in _context.Teacher
                       on m.AcNoId equals t.Id into tempTeacher
                       from ta in tempTeacher.DefaultIfEmpty()

                   select new
                   {
                        Type = m.TestOption.ToString(),
                        Student = st.StudentName ?? string.Empty,
                        Teacher = ta.TeacherName ?? string.Empty
                   }).ToList();

Вместо условного объединения этот запрос выполняет следующий запрос на SQL Profiler

    exec sp_executesql N'SELECT [m].[TestOption], COALESCE([s].[StudentName], @__Empty_0) AS [Student], COALESCE([t].[TeacherName], @__Empty_1) AS [Teacher]
FROM [Mapper] AS [m]
LEFT JOIN [Student] AS [s] ON [m].[AcNoId] = [s].[Id]
LEFT JOIN [Teacher] AS [t] ON [m].[AcNoId] = [t].[Id]
WHERE ([m].[TestOption] = 2) AND ([m].[TestOption] = 1)',N'@__Empty_0 nvarchar(4000),@__Empty_1 nvarchar(4000)',@__Empty_0=N'',@__Empty_1=N''

Как мне это сделать ????

1 Ответ

2 голосов
/ 05 июля 2019

Вы можете использовать приведенный ниже код, без необходимости использовать операторы join или where для _context.Mapper:

(from m in _context.Mapper
    select new
    {
        Type = m.TestOption.ToString(),
        Student = _context.Student
            .FirstOrDefault(s => 
                m.TestOption == TestOption.Student && 
                s.Id == m.AcNoId) ?? string.Empty,
        Teacher = _context.Teacher
            .FirstOrDefault(t => 
                m.TestOption == TestOption.Teacher && 
                t.Id == m.AcNoId) ?? string.Empty,
    })
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...