2016-07-25 54 views
1

我有以下代碼C#:DataStax卡桑德拉C#驅動程序:(?)凡在查詢與採集參數

IMapper mapper = new Mapper(session); 

//... 

var names = new [] {"n1", "n2", "n3"}; 
//Generation of question marks 
var inStr = string.Join(",", names.Select(n=>"?")); 
var users = mapper.Fetch<User>($"SELECT * FROM users WHERE name IN ({inStr})", names); 

這種方法的工作原理。 但也許有人知道更優雅的解決方案?

+2

不幸的是,我不知道一個更優雅的解決方案。但我可以想象,驅動程序不支持從頭開始使用此功能,因爲對大型列表使用IN語句會導致嚴重的性能問題,如以下文章中所述:https://lostechies.com/ryansvihla/2014/ 9月22日/卡桑德拉查詢圖案 - 不使用最在查詢換多分區/。 – medvekoma

+0

感謝您的鏈接!從根本上改變我們的查詢對我來說是不可能的。長列表可以批量轉換100個條目。 – bobah75

回答

2

要在單個參數中提供動態值列表,請在查詢中使用IN運算符,然後使用不帶圓括號的問號佔位符。

例如:

var names = new [] {"n1", "n2", "n3"}; 
var users = mapper.Fetch<User>("SELECT * FROM users WHERE name IN ?", names); 
+1

謝謝!這正是我所期待的。但由於數組協方差參數傳遞如此:new object [] {names} – bobah75