C# 基于C集合筛选SQL表结果

C# 基于C集合筛选SQL表结果,c#,linq,tsql,C#,Linq,Tsql,我有一个简单的表,基本上有一个NVARCHAR Name列和一个DateTime Timestamp列。我想编写一个C函数,它接受名称和日期时间的集合,并返回表中名称匹配且集合中的日期时间早于表中日期时间的所有内容 我的非SQL大脑想出的简单方法是创建一个SELECT语句来获取所有匹配的名称“SELECT Name,Timestamp From MyTable WHERE Name IN…”,然后遍历返回的集合,比较日期时间 对于SQL或Linq,必须有更好的方法来实现这一点。我怎样才能更有效地

我有一个简单的表,基本上有一个NVARCHAR Name列和一个DateTime Timestamp列。我想编写一个C函数,它接受名称和日期时间的集合,并返回表中名称匹配且集合中的日期时间早于表中日期时间的所有内容

我的非SQL大脑想出的简单方法是创建一个SELECT语句来获取所有匹配的名称“SELECT Name,Timestamp From MyTable WHERE Name IN…”,然后遍历返回的集合,比较日期时间

对于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();
使用一个大的IN-list并不一定不好,但是如果列表中有上千个元素,那么您可能会遇到问题,因为参数的数量可能会导致问题

但基本上,另一种方法是加入一些临时表。但是,使用该策略需要将数据插入表中,因此,除非可以多次重用查询,否则插入筛选数据所涉及的工作将大大超过返回结果的工作

这里和其他地方一样,最好的建议是查看查询分析器的结果

下面显示了使用临时表的第二种方法的示例。在这里,您可以获得在联接中使用索引的好处,但这应该与每个筛选器值的插入成本以及使用筛选器函数的代码的复杂性形成对比。一个简单的IN子句是由LINQ自动生成的,而临时表方法需要在代码中进行大量的填充

   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
使用一个大的IN-list并不一定不好,但是如果列表中有上千个元素,那么您可能会遇到问题,因为参数的数量可能会导致问题

但基本上,另一种方法是加入一些临时表。但是,使用该策略需要将数据插入表中,因此,除非可以多次重用查询,否则插入筛选数据所涉及的工作将大大超过返回结果的工作

这里和其他地方一样,最好的建议是查看查询分析器的结果

下面显示了使用临时表的第二种方法的示例。在这里,您可以获得在联接中使用索引的好处,但这应该与每个筛选器值的插入成本以及使用筛选器函数的代码的复杂性形成对比。一个简单的IN子句是由LINQ自动生成的,而临时表方法需要在代码中进行大量的填充

   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

我有一篇关于在此处传递ID列表的博文:

最后看起来像:

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

我有一篇关于在此处传递ID列表的博文:

最后看起来像:

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

给定包含字符串和日期时间的某种类型的列表:

public class MyType
{ 
    public Name {get;set;} 
    public Timestamp {get;set;}
}
存储过程搜索结果填充列表myList 您还将获得一个字符串列表list myNamesList

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

结果显示在筛选结果列表中。

给定包含字符串和日期时间的某种类型的列表:

public class MyType
{ 
    public Name {get;set;} 
    public Timestamp {get;set;}
}
存储过程搜索结果填充列表myList 您还将获得一个字符串列表list myNamesList

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

结果显示在筛选结果列表中。

如果您使用的是SQLServer2008,另一种选择可能是将.net数据表传递给TSQL。有关更多信息:

如果您使用的是SQLServer2008,另一种选择可能是将.net数据表传递给TSQL。更多信息:

这是我们在工作中所做的。。。然后,您可以将xml查询到临时表中,并执行连接等操作。谢谢JBrooks和CraigW。我们将使用数据集上的查询分析器来检查这一点+1.这就是我们在工作中所做的。。。然后,您可以将xml查询到临时表中,并执行连接等操作。谢谢JBrooks和CraigW。我们将使用数据集上的查询分析器来检查这一点+1.感谢您提供有关查询分析器的提示以及此处的连接示例。包含对各种解决方案的深入讨论。感谢您提供有关查询分析器的提示以及此处的连接示例。包含对各种解决方案的深入讨论。