2010-12-13 3 views
0

У меня есть 3 таблицы:Нужна помощь на LINQ-запроса

Table User (UserID, Username) 
Table Admin (AdminID, Username) 
Table PM (PMID, SenderID, Sendertype, RecipientID, RecipientType) 

Теперь я, в 1 Запрос:

  • Получить всю информацию от PM
  • если SenderType == 'A' присоединить SenderID к Admin-Table, получить имя пользователя
  • if SenderType == 'U' присоединить SenderID к пользовательской таблице, получить имя пользователя
  • , если RecipientType == 'A' присоединяется к RecipientID к A Dmin-Table, получить имя пользователя
  • если RecipientType == 'U' присоединиться к RecipientID User-таблицы, получить Имя пользователя

кто-то есть идеи, как решить в 1 запрос?

+2

Просьба ввести код, который вы написали. Люди обычно не любят просто писать свой код для вас. Как бы то ни было, это описание работы, а не вопрос. –

+0

О каком Linq вы говорите? Linq to SQL или Entity Framework? –

ответ

0

Почему бы не просто иметь одну пользовательскую таблицу, которая вместо этого имеет пользовательский тип пользователя или администратора, вы можете сэкономить массу проблем ... Запросы LINQ переводится непосредственно на SQL, поэтому я не уверен, если вы может сделать неопределенное соединение, подобное этому только в одном запросе.

В качестве альтернативы, если вы не хотите изменять таблицы, вы также можете создать представление, которое делает в основном одно и то же.

Или напишите хранимая процедура.

Если вы действительно хотите использовать LINQ, вам, вероятно, придется выполнить несколько запросов. Вы можете объединить две таблицы User/Admin с третьим полем для дифференциации, а затем присоединиться к своей таблице PM, используя этот набор данных.

+0

Я использую представление для этого, спасибо. – Kovu

0

попробовать это решение

var q = from pm in PM 
     select new { 
      pm.PMID, 
      pm.SenderID, 
      pm.Sendertype, 
      pm.RecipientID, 
      pm.RecipientType, 
      Username = pm.SenderType == "A" ? pm.Admin.Username : 
         pm.SenderType == "U" ? pm.User.Username : "", 
      RecipientType = pm.RecipientType == "A" ? pm.Admin.Username : 
         pm.RecipientType == "U" ? pm.User.Username : "" 
     } 
0

Как я всегда рекомендую, разразится LINQPad и играть. Если вы не делаете команду pivot или bulk insert, в T-SQL почти ничего не может сделать, чего вы не можете сделать в Linq.

Трюк на этом состоит в том, чтобы сделать запрос объединения между вашими таблицами Admin и User. После этого он легко объединяется. Хотя я разбил его на два утверждения, это было для ясности - на самом деле выполняется только один запрос. Если вы отчаянно нуждаетесь в одном заявлении, вы можете легко сделать это здесь. Итак, вот ваш код (проверено в LinqPad):

var combined = Admins.Select(a => new {ID = a.AdminID, UserType = "A", Username = a.Username}).Union(
       Users.Select(u => new {ID = u.UserID, UserType = "U", Username = u.Username})); 

var result = from p in PMs 
      join sendr in combined on new {ID = p.SenderID, UserType = p.Sendertype} equals new {sendr.ID, sendr.UserType} 
      join recpt in combined on new {ID = p.RecipientID, UserType = p.RecipientType} equals new {recpt.ID, recpt.UserType} 
      select new {p, sendr, recpt}; // pretty this anon-type up if desired... 
result.Dump(); 
Смежные вопросы