如果我正确理解你的问题,我想你想的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;
这就是我最终使用的,本质上。然而,我正在寻找的是一个查询,它返回那些完全(在本例中)2个URL的DesignID,其中这两个URL完全匹配列表中的两个。这将返回DesignIDs(与其URL匹配),即使其中一个URL与列表中的至少一个urlString匹配。所以,我已经开始使用代码来进一步缩小列表的范围,只将它们与count和content完全匹配。我希望能够在LinqToSql查询中完成所有操作,而不需要代码。 – jeromeyers
啊,我明白你在那里做什么了!我用(未经测试的)更新的解决方案编辑解决方案.. –
太棒了!我不得不改变一些事情。基本上,你忽略了使用“localUrlStrings”列表。因此,我在group by语句之前添加了“where localUrlStrings.Contains(u.UrlString)”,并用“== localUrlStrings.Count”替换了“> = 2”。而且,当你用“j”分组时,“j”来自Urls表,所以你必须使用“j.RelationalGuid”而不是“j.DesignGuid”。但实质上,你的答案产生了(对于有2个URL的列表),结果是我们以前解决方案的一半(这是预期的,因为有2个URL)。完善!谢谢! – jeromeyers