我想从已经定义的字符串列表中选择数据,稍后将根据具有某些条件的列表进行过滤。
但是当我尝试以下代码时:
List<string> inventoryList = new List<string>();
inventoryList.Add("a147");
inventoryList.Add("w150");
string.Format("SELECT * FROM (VALUES '{0}') AS InventoryList(InventoryCode)"
+ " SELECT a.[InventoryCode] FROM [InventoryList] a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146", inventoryList);
--- Other codes to connect to the database and so on ----
它将生成如下:
SELECT * FROM (VALUES 'System.Collections.Generic.List`1[System.String]') AS InventoryList(InventoryCode) SELECT a.[InventoryCode] FROM [InventoryList] a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146
我得到的错误是:
异常:'System.Collections.Generic.List`1 [System.String]'附近的语法不正确。
编辑:
预期结果将为列名创建InventoryList
表InventoryCode
,其中包含上述值:
InventoryList <-- table
InventoryCode <-- column name
1. a147
2. w150
然后,将像正常一样进行查询:
SELECT a.[InventoryCode] FROM InventoryList a INNER JOIN [PlayerAccount] ....
答案 0 :(得分:2)
您预期的SQL查询
SELECT * FROM (VALUES 'a147', 'w150') AS InventoryList(InventoryCode)
SELECT a.[InventoryCode] FROM [InventoryList] a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146
有两个问题。第一个问题是,以下SELECT
语句无效
SELECT * FROM (VALUES 'a147', 'w150') AS InventoryList(InventoryCode)
您将收到Incorrect syntax near 'a147'
错误。它应包括(
和)
,如下所示
SELECT * FROM (VALUES ('a147'), ('w150')) AS InventoryList(InventoryCode)
第二个问题,您无法在第二个SELECT
声明中InventoryList
SELECT
{/ 1}}
SELECT a.[InventoryCode] FROM [InventoryList] a
因为InventoryList
不是真正的表格。您将收到Invalid object name 'InventoryList'
错误。
您应该将两个陈述合并如下
SELECT a.[InventoryCode]
FROM (SELECT * FROM (VALUES ('a147'), ('w150')) AS InventoryList(InventoryCode)) a
INNER JOIN [PlayerAccount] b WITH (NOLOCK)
ON a.[InventoryCode] = b.[PlayerInventoryCode]
WHERE b.[PlayerID] = 146
现在我们开始使用C#生成上述查询。如果您inventoryList
定义如下
List<string> inventoryList = new List<string>();
inventoryList.Add("a147");
inventoryList.Add("w150");
您可以使用string.Join
和Linq选择的组合
string values = string.Join(",", inventoryList.Select(x => "('" + x + "')"));
生成以下输出:('a147'),('w150')
,然后使用如下values
变量生成预期的SQL查询
string output = string.Format("SELECT a.[InventoryCode] FROM (SELECT * FROM (VALUES {0}) AS InventoryList(InventoryCode)) a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146", values);
答案 1 :(得分:1)
您需要使用如下的string.format方法。
string.Format("SELECT * FROM (VALUES '{0}','{1}') AS InventoryList"
+ " SELECT a.[InventoryCode] FROM [InventoryList] a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146", inventoryList[0] , inventoryList[1]);
您可以将 string.join string.Join("','", inventoryList.ToArray())
用于n个项目
string.Format("SELECT * FROM (VALUES '{0}') AS InventoryList"
+ " SELECT a.[InventoryCode] FROM [InventoryList] a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146", string.Join("','", inventoryList.ToArray()));