2010-12-13 153 views
0

我有3個表:需要幫助的LINQ查詢

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

現在我將在1個查詢:

  • 從PM獲取所有信息
  • 如果SenderType == 'A'如果SenderType =='U'將SenderID加入User-Table,則可以使用用戶名
  • 如果RecipientType =='A'將RecipientID加入到A DMIN-表,獲得用戶名
  • 如果RecipientType == 'U' 加入到RecipientID用戶表,獲取用戶名

人有一個想法如何在1個查詢解決?

+2

請發佈你迄今爲止寫的代碼。人們通常不喜歡只爲你寫代碼。事實上,這是一個工作描述,而不是一個問題。 – 2010-12-13 00:26:35

+0

Linq你在說什麼? Linq到SQL或實體框架? – 2010-12-13 00:39:03

回答

0

爲什麼不只是有一個用戶表,而是有一個用戶類型的用戶或管理員,你可以節省自己很多麻煩...... LINQ查詢直接轉換爲SQL,所以我不知道你是否可以在一個查詢中進行不確定的連接。

另外,如果你不想修改表,你也可以創建一個基本上相同的視圖。

或者寫一個存儲過程。

如果你真的想使用LINQ,你可能需要做多個查詢。您可以將兩個用戶/管理表與第三個字段進行合併以區分,然後使用該數據集加入到PM表中。

+0

我使用了一個視圖,謝謝。 – Kovu 2010-12-13 00:40:54

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和發揮。除非你在做pivotbulk insert聲明,否則在T-SQL中你幾乎沒有辦法在Linq中做什麼。

這一招的訣竅是在您的AdminUser表之間進行聯合查詢。之後,它很容易合在一起。雖然我把它分成兩個語句,但這只是爲了清楚起見 - 實際上只有一個查詢被執行。如果你對一個陳述感到絕望,你可以從這裏輕鬆地做到這一點。所以這裏是你的代碼(在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();