2011-07-21 159 views
0

我有两个表:设计和Url。设计可以通过Guid(这不是设计表的主键,因为URL可以通过同一列与其他表相关)与许多URL相关。(复杂?)LINQtoSQL查询

Design (table) 
------- 
DesignGuid 

URL (table) 
------ 
RelationalGuid 
UrlString 

在我的代码我试图确定,我给出的一些信息,需要一种新的设计记录的创建,或者如果它对应于现有的设计记录。这些信息包括一个URL列表。这些URL是确定是否需要创建新记录的唯一方法。

var localUrlStrings = new List<string>() { "urlString1", "urlString2" }

所以,我需要,我给出的网址列表,并编写一个查询,着眼于现有的设计记录及其相关的URL和返回匹配IFF的网址完全匹配。所以,如果我在我的代码中给出了2个URL,那么我只需要查找与恰好与代码2完全匹配的2个URL相关联的设计(应该是1或0匹配)。

感谢, Jeromeyers

回答

2

如果我正确理解你的问题,我想你想的SQL查询看起来是这样的:

SELECT d.DesignGuid 
FROM Design AS d 
INNER JOIN URL as u ON d.DesignGuid = u.RelationalGuid 
WHERE u.UrlString IN ('urlstring1', 'urlstring2', ... ,'urlstringn') 

我觉得这样的事情应该工作:

var localUrlStrings = new List<string>() { "urlString1", "urlString2" } 

var result = 
    from d in Design 
    from u in URL 
    where d.DesignGuid == u.RelationalGuid 
    && localUrlStrings.Contains(u.UrlString) 
    select new { 
     d.DesignGuid, 
     u.UrlString 
    }); 

编辑:您正在寻找这样的:

SELECT d.DesignGuid, count(u.URL) as numURLs 
FROM Design as d, 
    Url as u 
WHERE d.DesignGuid = u.RelationalGuid 
HAVING count(u.URL) = 2 

我现在不能测试,但我相信这应该做的伎俩(语法可能有点过,我我会在早上仔细检查一下):

var result = 
    from d in dataContext.Designs 
    join u in dataContext.URLs on d.DesignGuid equals u.RelationalGuid into joinTable 
    from j in joinTable 
    where localUrlStrings.Contains(j.UrlString) 
    group j by j.RelationalGuid into groupTable 
    where groupTable.Count() == localUrlStrings.Count 
    select groupTable.Key; 
+0

这就是我最终使用的,本质上。然而,我正在寻找的是一个查询,它返回那些完全(在本例中)2个URL的DesignID,其中这两个URL完全匹配列表中的两个。这将返回DesignIDs(与其URL匹配),即使其中一个URL与列表中的至少一个urlString匹配。所以,我已经开始使用代码来进一步缩小列表的范围,只将它们与count和content完全匹配。我希望能够在LinqToSql查询中完成所有操作,而不需要代码。 – jeromeyers

+0

啊,我明白你在那里做什么了!我用(未经测试的)更新的解决方案编辑解决方案.. –

+0

太棒了!我不得不改变一些事情。基本上,你忽略了使用“localUrlStrings”列表。因此,我在group by语句之前添加了“where localUrlStrings.Contains(u.UrlString)”,并用“== localUrlStrings.Count”替换了“> = 2”。而且,当你用“j”分组时,“j”来自Urls表,所以你必须使用“j.RelationalGuid”而不是“j.DesignGuid”。但实质上,你的答案产生了(对于有2个URL的列表),结果是我们以前解决方案的一半(这是预期的,因为有2个URL)。完善!谢谢! – jeromeyers

0

尝试(不完全确信需要确切的结果):

var Result = from d in Design from u in URL from l in localUrlStrings 
      where d.DesignGuid == u.RelationalGuid and 
      l == u.UrlString select new { l, d.DesignGuid }; 
+0

我期待的很多,但我试了一下。在LINQ to SQL查询中,不能以这种方式使用本地序列。我可以做一个urls.contains(u.UrlString)...异常消息是:“本地序列不能用于除Contains运算符以外的查询运算符的LINQ to SQL实现。”这是LinqToSql的一个麻烦方面。 – jeromeyers

+0

我继续编辑标题以反映LinqToSql约束条件 – jeromeyers