2011-06-14 59 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的过滤结果的>。