2009-08-03 59 views
0

我有一個包含服務器名稱和登錄名的表。我需要檢索在一組服務器中通用的登錄名。LINQ to SQL - 掙扎着查詢

鑑於以下數據:

ServerName Login 
------------------------------- 
Server1  User1 
Server2  User1 
Server2  User2 

我會通過在服務器1,服務器並取回只有用戶1爲用戶2沒有關聯Server1上。

任何人都可以告訴我這將如何在LINQ to SQL中實現嗎?

我試過Contains,但是它返回所有服務器上的所有用戶,這與我所尋找的相反。

編輯:我的一個同事設法寫的什麼,我以後版本的SQL ....

SELECT Login 
    FROM ServerLogins 
    WHERE ServerName IN ('Server1', 'Server2') 
GROUP BY Login 
HAVING count(Login) = 2 

但我們都不知道怎麼翻譯成LINQ查詢這一點。

附加編輯:

隨着瑞恩的幫助和VB和C#之間的LINQ的差別一些谷歌搜索,我得到了以下工作。

Dim logins = From l In dc.ServerLogins _ 
      Where servers.Contains(l.ServerName) _ 
      Group l By l.Login Into Group _ 
      Where Group.Count() = servers.Count _ 
      Select Login 

再次感謝大家的幫助。

尼克

+1

你能給我們提供你正在嘗試的LINQ語句嗎? – 2009-08-03 13:36:58

+1

您可以發表一個代碼示例嗎? – sloth 2009-08-03 13:38:16

回答

2

這是我想出的。如果你擔心它,你可能想要檢查並找出它實際產生的SQL。

List<string> servers = new List<string>{"Server1", "Server2"}; 

var logins = from l in context.ServerLogins 
      where servers.Contains(l.ServerName) 
      group l by l.Login into g 
      where g.Count() == servers.Count 
      select g.Key; 
0

我個人認爲這是一個很好的地方,避免使用LINQ到SQL,轉而使用一個存儲過程或一個標準的SQL查詢。我認爲即使你想在Linq中提出正確的查詢,它也不會很可讀和/或有效。

你會看起來像這樣的SQL:

SELECT Login 
FROM ServerLogins 
WHERE ServerName IN ('Server1', 'Server2') 
GROUP BY Login 
HAVING COUNT(*) = 2 

注意「2」中的最後一行應與服務器名稱的上方(「列表中(數量」代替Server1','Server2')「)。

+0

鬼,這就是我們剛剛想出了:) 這是目前在存儲過程做了詳細的語句,但它使用連續數字的一張桌子和一個臨時表,服務器名稱的逗號分隔的列表轉換到一個臨時表對其中在IN語句運行,我很想不要有這樣做(或有寫在運行時字符串中的SQL) – Nick 2009-08-03 14:13:01

0

只要有傳遞在我像這樣的東西去服務器上的#合理的實際限制:

public ICollection<Login> GetLoginsForServers(params string[] servers) 
{ 
    if (servers == null || servers.Length == 0) 
     return new List<Login>(); 

    var logins = db.Logins.Where(p => p.ServerName == servers[0]); 
    for (int i=1; i<servers.Length; i++) 
    { 
     logins = logins.Intersect(db.Logins.Where(p => p.ServerName == servers[i])); 
    } 

    return logins.ToList(); 
} 

基本上你已經開始與相關聯的所有登錄然後第一臺服務器將其限制爲與每個後續服務相關的那些服務由於查詢直到ToList()纔得到執行,您仍然只能查詢數據庫一次,雖然查詢本身一定很難看,但希望LINQ2SQL提供程序能夠生成一些能夠產生有效查詢計劃的東西。