2009-08-03 60 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提供程序能够生成一些能够产生有效查询计划的东西。