2016-08-18 1 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 только один раз и получить вывод всех операторов select в одной переменной. Пожалуйста, помогите, новичок в dapper.net. Как я могу добиться этого

+0

В какой базе данных у вас есть? –

+0

Использование SQL Server – Manjari

ответ

1

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

Если вы используете SQL Server, следующий запрос возвращает все записи из всех таблиц. Очевидно, что если вам нужно только подмножество вы можете добавить «И t.name IN („ххх“,„его“,„ZZZ“)» в где:

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. Я не использую dapper, поэтому вам нужно будет изменить это самостоятельно!

+0

Спасибо за ваше предложение. Здесь мое t.name представляет собой коллекцию (список ) и является динамическим значением. В этом случае, как обращаться. – Manjari

1

Код расширения параметра Dapper не обрабатывает запросы IN с помощью списков, однако DapperExtensions «предикатная система разрешает запросы IN и преобразует предикат запроса равных в запрос IN, если этот параметр является типом списка.

Если вы хотите использовать Dapper для сопоставления, вы можете расширить запрос sysobjects/sysindexes Jonathan Willcock как представление и создать класс для представления результатов. Затем можно собрать запрос 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 вы можете увидеть производительность dr op, если ваш список параметров (имена таблиц в этом экземпляре) больше, чем около 200 записей.

Смежные вопросы