2016-08-18 43 views
0

我正在使用下面的代碼來查詢表列表中的表的計數。從多個查詢中獲取數據而不使用foreach

List<string> tablelist = //some value 
foreach(string table in tablelist) 
{ 
var rowcount = string.Format("select count(*) from " + view + " WITH (NOLOCK)"); 
int countresult = con.Query<int>(rowcount).FirstOrDefault(); 
if(countresult >0) 
{ //someoperation } 
} 

這裏每次調用DB。有沒有什麼選擇,我可以只調用一次數據庫,並獲得所有選擇語句的輸出在一個單一的變量。 請幫助我對dapper.net感興趣。我怎樣才能做到這一點

+0

您正在使用哪個數據庫? – 2016-08-18 08:38:09

+0

使用SQL Server – Manjari

回答

1

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=21021

如果您正在使用SQL Server,以下查詢返回所有表中的所有記錄。很顯然,如果你只需要一個子集,你可以在 「IN( 'XXX', 'YYY', 'ZZZ')和t.name」 添加到其中:

select t.name TableName, i.rows Records 
from sysobjects t, sysindexes i 
where t.xtype = 'U' and i.id = t.id and i.indid in (0,1) 
order by TableName; 

要構建IN字符串,做

StringBuilder inSql = new StringBuilder(" AND t.name IN('"; 
bool firstTime = true; 
foreach(string tname in tablelist) 
{ 
    if (firstTime) 
    { 
     firstTime = false; 
     inSql.Append(tname + "'"); 
    } 
    else 
    { 
     inSql.Append(", '" +tname +"'"); 
    } 
} 
string sQL = "select t.name TableName, i.rows Records from sysobjects t, sysindexes i where t.xtype = 'U' and i.id = t.id and i.indid in (0,1)" 
    + inSql.ToString() + ") order by TableName"; 

請注意這會返回一個記錄集,因此您需要將您的調用改爲con.Query。我不使用小巧,所以你需要自己改變它!

+0

感謝您的建議。這裏我的t.name是一個集合(列表)並且是動態值。在那種情況下如何處理。 – Manjari

1

Dapper的參數擴展代碼不處理帶有列表的IN查詢,但是DapperExtensions謂詞系統確實允許IN查詢,並且如果該參數是列表類型,則會將等於查詢謂詞轉換爲IN查詢。

如果您想堅持使用Dapper進行映射,可以將Jonathan Willcock的sysobjects/sysindexes查詢作爲視圖進行擴展,並創建一個類來表示結果。然後,您可以組裝一個DapperExtensions的GetList查詢適當的參數

視圖創建:

CREATE VIEW TableRowCounts 
AS 
SELECT t.name TableName, i.rows Records 
FROM sysobjects t INNER JOIN sysindexes i ON i.ID = t.ID where t.xtype = 'U' and i.indid in (0,1) 

班結果:

public class TableRowCounts 
{ 
    public string TableName { get; set; } 
    public int Records { get; set; } 
} 

DapperExtensions查詢來滋潤效果:

PredicateGroup query = new PredicateGroup(); 
List<string> tables; 

tables = new List<string> { "table1", "table2" }; 
query.Predicates = new List<IPredicate>(); 
query.Predicates.Add(Predicates.Field<TableRowCounts>(f => f.TableName, Operator.Eq, tables)); 

List<TableRowCounts> results; 
results = _connection.GetList<TableRowCounts>(query).ToList(); 

作爲關於IN表演的備註,您可能會看到表演博士如果你的參數列表(在這個例子中是表名)大於大約200個條目,請選擇op。

相關問題