2014-09-09 5 views
0

Какой был бы наилучший подход для преобразования этого SQL в linq?Условный запрос linq

Я ранее делал представления в базе данных на основе такого sql, а затем запрашивал представление с помощью linq. Но я хотел бы знать, есть ли другие подходы.

SQL находит назначенный объект для задачи. Таблица задач содержит три столбца внешнего ключа, поскольку назначенные могут быть из отдела, должности или лица. Разрешается только одно.

SQL:

SELECT id, 
     title, 
     assigned_to = (case 
      when idAssignedDepartment is not null then (select description from department where id = idAssignedDepartment) 
      when idAssignedPosition is not null then (select description from position where id = idAssignedPosition) 
      when idAssignedPerson is not null then (select fullname from person where id = idAssignedPerson)    
      end) 
FROM  task 

Использование LinqToEF

+0

Ваш вопрос довольно широк. Какой вкус linq вы используете? L2E, L2S, L2D? Вы должны опубликовать код C# того, что у вас есть, и то, что вы хотели бы выполнить. – Shoe

ответ

2

Вы можете написать это:

var q = from t in task 
     from dep in department.Where(x => x.id == t.idAssignedDepartment).DefaultIfEmpty() 
     from pos in position.Where(x => x.id == t.idAssignedPosition).DefaultIfEmpty() 
     from per in person .Where(x => x.id == t.idAssignedPerson).DefaultIfEmpty() 
     select new 
     { 
      t.id, 
      t.title, 
      assigned_to = t.idAssignedDepartment != null ? dep.description : 
          t.idAssignedPosition != null ? pos.description : 
          t.idAssignedPerson != null ? per.fullname : 
          null 
     }; 
+0

Хотя я получаю NotSupportedException: в этом контексте поддерживаются только примитивные типы или типы перечислений. – Kman

+0

@Kman делает ваш запрос таким же, как это, или вы делали какие-либо дополнения? – Magnus

+0

Это выглядит точно так, кажется, что когда я добавляю в запрос несколько «от», я получаю это исключение. – Kman

Смежные вопросы