基于C#集合筛选SQL表结果
本文关键字:结果 SQL 筛选 集合 基于 | 更新日期: 2023-09-27 17:59:13
我有一个简单的表,它基本上有一个NVARCHAR Name列和一个DateTime Timestamp列。我想写一个C#函数,它接受Names和DateTimes的集合,并从我的表中返回Names匹配的所有内容,并且集合中的DateTimes比表中的DateTime旧。
我的非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();
我有一篇关于在这里传递ID列表的博客文章:使用XML 向存储过程传递ID
最终看起来像:
EXECUTE dbo.getLocationTypes '<IDList><ID>1</ID><ID>3</ID></IDList>',
'<IDList><ID>200</ID><ID>300</ID><ID>400</ID></IDList>'
使用一个大的IN
列表并不一定是坏事,但如果列表中有数千个元素,则可能会遇到问题,因为参数的数量可能会导致问题。
但基本上,另一种方法是加入某个(临时)表。然而,使用该策略需要将数据插入表中,因此,除非您可以多次重用查询,否则插入筛选数据所需的工作量将大大超过返回结果的工作量。
不过,这里和其他地方一样,最好的建议是查看查询分析器的结果。
下面显示了使用临时表的第二种方法的示例。在这里,您可以获得在JOIN中使用索引的好处,但这应该与每个过滤器值的插入成本以及使用过滤器函数的代码的复杂性形成对比。(一个简单的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
给定一个包含字符串和日期时间的某种类型的列表:
public class MyType
{
public Name {get;set;}
public Timestamp {get;set;}
}
SPROC搜索结果填充List<我的类型>myList您还得到一个字符串列表list<字符串>myNames列表
var results = myList.Where(r => myNamesList.Contains(r.Name) && myList.Timestamp > someDateTime).ToList();
结果在列表<我的类型>的筛选结果。
如果您使用的是SQLServer2008,另一种选择可能是将.net DataTable传递给TSQL。有关更多信息:http://www.sommarskog.se/arrays-in-sql-2008.html#DataTable