SQL Server使用多种数据类型

时间:2017-05-04 07:57:26

标签: c# sql-server

我无法想出一个更好的头衔。

我有一个值列表,如:

List<string> ids = new List<string>() {"1", "AND", "2", "NOT", "3"}

一个数据库表,其中包含上面列表中指定的ID。 我的问题是我需要根据id检索数据,包括表中未找到的值(上面列表中的运算符ANDNOT)。 例如,使用上面的列表,在读取123的db值后,将创建一个新列表,如:

List<string> values = {"Value1", "AND", "Value2", "NOT", "Value3"}

运营商ANDORNOT)(只是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') 

我希望收到数据库Value1Value2AND。我知道在执行查询时无法保证订单。

我怎样才能有效地解决这个问题?我使用c#sql server 2012没有任何orm

2 个答案:

答案 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);

但这会大大降低你的表现