2011-07-21 198 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