不使用foreach从多个查询中获取数据

时间:2016-08-18 08:25:21

标签: sql .net dapper

我使用以下代码查询表格列表中的表格数。

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。是否有任何选项我只能调用DB一次,并在单个变量中获取所有select语句的输出。 请帮助我是dapper.net的新手。我怎样才能实现这个目标

2 个答案:

答案 0 :(得分:1)

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

如果您使用的是SQL Server,则以下查询将返回所有表中的所有记录。显然,如果您只需要一个子集,则可以添加&#34; AND t.name IN(&#39; xxx&#39;,&#39; yyy&#39;,&#39; zzz&#39;)&# 34;到哪里:

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的调用。我不使用小巧玲珑,所以你需要自己改变它!

答案 1 :(得分:1)

Dapper的参数扩展代码不会使用列表处理IN查询,但是DapperExtensions&#39;谓词系统允许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个条目,您可能会看到性能下降。

相关问题