我无法想出一个更好的头衔。
我有一个值列表,如:
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
)。
我尝试过多次使用where条件,但我无法将运算符(字符串)转换为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
子句(或任何其他子句),并且在db中找不到结果的地方返回查询中使用的值。
例如,对于查询:
SELECT Title
FROM MyTable where Id in (1,2,'AND')
我希望收到数据库Value1
,Value2
,AND
。我知道在执行查询时无法保证订单。
我怎样才能有效地解决这个问题?我使用c#
与sql server 2012
没有任何orm
答案 0 :(得分:1)
首先,您需要从列表中提取需要转换的列表条目,即您的搜索键。
完成后,您可以查询以下内容:
select id, title from MyTable where id in ( /* list goes here*/)
将查询结果加载到Dictionary<int,string>
。
然后,再次浏览列表,用字典中的值替换键。
如果您发现SQL查询执行得很糟糕,您应该查看索引和查询提示,或再次询问更快的查询。
为什么这可能会提高效果
主要原因是它会减少到数据库的访问。但是,如果数据库位于同一物理计算机上,则这不太可能很重要。
或者,如果键和标题列表不经常更改,并且它可以稍微过时,则可以将整个内容加载到字典中。 100,000个条目并不多 - 如果它们各50个字节,那么只有5个MB,这在现代服务器上并不是很多。
答案 1 :(得分:-1)
您可以尝试在SQL查询中强制转换ID
var labelIndex = e.labelIndex;
var label = this.getLabel(labelIndex);
var value = xAxis.scale().ticks().get()[labelIndex];
label.format(value * 2);
但这会大大降低你的表现