我无法提出一个更好的标题。
我有一个值列表:
List<string> ids = new List<string>() {"1", "AND", "2", "NOT", "3"}
和一个包含上面列表中指定的ID的数据库表。我的问题是我需要基于ID检索数据,包括表中未找到的值(上面列表的操作员AND
和NOT
(。例如,使用上面的列表,在阅读了1
,2
和3
的DB值之后,将创建一个新列表,例如:
List<string> values = {"Value1", "AND", "Value2", "NOT", "Value3"}
操作员AND
,OR
,NOT
,)
和(
只是MyTable
中未找到的简单字符串。
到目前为止,我一直在拆分ID,对于每个值,我都会前往DB并获得值。问题在于,即使对于2K列表,也需要大量时间。列表每个值约10个值。
我正在考虑的是使用where in
子句,该子句将有望减少到数据库的旅行。不幸的是,我不知道如何从第一个列表中处理操作员。(运算符未保存在MyTable
中(。
我尝试使用多个条件,但是我无法将操作员(字符串(转换为int
(ID列的类型(。
我尝试过的查询:
SELECT Title
FROM MyTable where Id =1 or Id = cast('AND' as int)
和
SELECT Title
FROM MyTable where Id in (1,2,'AND')
他们两个都失败(正确(,因为SQL无法将AND
转换为数据类型int
。
我想要的是将where
子句(或任何其他(用于第一个列表,而在数据库中找不到结果,返回查询中使用的值。例如,对于查询:
SELECT Title
FROM MyTable where Id in (1,2,'AND')
我想从DB Value1
,Value2
,AND
接收。我知道执行查询时不能保证订单。
如何有效地解决这个问题?我正在使用c#
与sql server 2012
一起使用任何ORM
首先,您需要提取需要转换的那些列表条目,即从列表中提取搜索键。
完成后,您可以这样查询:
select id, title from MyTable where id in ( /* list goes here*/)
将查询的结果加载到Dictionary<int,string>
中。
然后,第二次浏览列表,用字典中的值替换键。
如果您发现SQL查询执行不佳,则应查看索引和查询提示,或再次索要更快的查询。
为什么这可能会改善性能
主要原因是它将减少到数据库的旅行。但是,如果数据库在同一物理机器上,则不太可能很重要。
另外,如果键和标题的列表不经常更改,并且可以稍微过时,则可以将整个内容加载到字典中。100,000个条目并不多 - 如果它们是50个字节,每个字节只有5 MB,而现代服务器上的数字不多。
您可以尝试在SQL-Query
中施放IDSELECT Title
FROM MyTable where cast(Id as nvarchar) in (1,2,'AND')
,这将大大降低您的性能