2011-06-14 56 views
0

我有一個簡單的表,基本上有一個NVARCHAR名稱列和DateTime時間戳列。我想編寫一個C#函數,該函數接收名稱和日期時間的集合,並從我的表中返回名稱匹配和日期時間在集合中的日期早於表中的日期時間的所有內容。基於C#集合過濾SQL表結果

我的非SQL大腦提出的簡單方法是創建一個SELECT語句以獲取所有匹配的名稱(「SELECT Name,Timestamp From MyTable WHERE Name IN(...)」),然後遍歷返回的集合比較DateTimes。

必須有更好的方法來用SQL或Linq來做到這一點。我如何更有效地做到這一點?

更新: 感謝您的有益反饋!聽起來像在這裏列出的各種方法上運行查詢分析器將是一條路。這裏有另外一個扔在那裏,如果有任何好奇:

List<Item> items = ... // this the collection 
var db = new ItemDataContext(); // From .Net EF 

    string[] results = (from item in items 
         from dbItem in db.Items 
         where item.Name.Equals(dbItem.Name,StringComparison.InvariantCultureIgnoreCase) 
          && item.Timestamp < dbItem.Timestamp 
         select dbItem.Token).ToArray(); 

回答

1

採用大IN列表不neccessarily壞,但你可能會遇到問題,如果你有列表中的元素的一千自參數numnber可能會導致問題。

但基本上另一種方法是加入一些(臨時)表。然而,使用該策略會要求您將數據插入表中,因此除非您多次重複使用查詢,否則插入過濾器數據所涉及的工作將大大超出返回結果的工作量。

作爲其他任何地方的最好建議是查看結果的查詢分析器。

下面顯示了使用臨時表的第二種方法的示例。在這裏你可能會得到在JOIN中使用索引的好處,但是這應該與每個過濾器值的插入成本和使用過濾器函數的代碼的複雜性形成對比。 (一個簡單的IN條款是由LINQ自動生成的,而臨時表方法需要在代碼中頗有些plumming。)

CREATE TABLE vals (v nvarchar(255), inserted DATETIME DEFAULT(getdate())) 

    SELECT * FROM vals 
    WHERE v IN ('a', 'aa', 'aaa') 

    DECLARE @filters TABLE (v varchar(256)) 

    INSERT INTO @filters (v) VALUES ('a') 
    INSERT INTO @filters (v) VALUES ('aa') 
    INSERT INTO @filters (v) VALUES ('aaa') 

    SELECT * FROM vals INNER JOIN @filters f 
    ON f.v = vals.v 
+0

感謝關於查詢分析器的提示以及此處的連接示例。 – jglouie 2011-06-15 01:30:06

+0

http:// www。sqlservercentral.com/articles/T-SQL/73838/包含了對各種解決方案的深入討論。 – faester 2011-06-21 12:19:58

2

我有一篇博客文章傳遞ID列表在這裏: Passing IDs to Stored Procs Using XML

最終看起來像:

EXECUTE dbo.getLocationTypes '<IDList><ID>1</ID><ID>3</ID></IDList>', 
'<IDList><ID>200</ID><ID>300</ID><ID>400</ID></IDList>' 
+1

這就是我們在工作中所做的......然後您可以將xml查詢到臨時表中並執行連接等。 – CraigW 2011-06-14 20:47:49

+0

謝謝JBrooks和CraigW。我們將在我們的數據集上使用查詢分析器進行檢查。 +1。 – jglouie 2011-06-15 01:28:40

1

由於包含字符串和日期時間某種類型的列表:

public class MyType 
{ 
    public Name {get;set;} 
    public Timestamp {get;set;} 
} 

存儲過程的搜索結果填充列表<的MyType > myList中 你還給出一個字符串列表<串> myNamesList列表

var results = myList.Where(r => myNamesList.Contains(r.Name) && myList.Timestamp > someDateTime).ToList(); 

結果列表< MyType的過濾結果的>。