2016-08-18 2 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를 호출 할 때마다. DB를 한 번만 호출하고 모든 select 문을 단일 변수에 출력 할 수있는 옵션이 있습니까? dapper.net을 (를) 새롭게 구하십시오. SQL Server를 사용하는 경우, 나는이

+0

어떤 데이터베이스를 사용하고 있습니까? –

+0

SQL 서버 사용 – Manjari

답변

1

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

을 달성 할 수있는 방법, 다음 쿼리는 모든 테이블의 모든 레코드를 반환합니다. 당신은 단지 당신이 어디에 "('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 쿼리를 뷰로 확장하고 결과를 나타내는 클래스를 만들 수 있습니다.

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(); 
:

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

DapperExtensions 결과를 수화 조회 : 결과에 대한

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) 

클래스 : 그런 다음 적절한 매개 변수를

뷰 생성을 DapperExtensions GetList 쿼리를 조립 수

IN 성능에 관한 부수적 인 설명으로 성능 분석 결과를 볼 수 있습니다. op 매개 변수 목록 (이 경우 테이블 이름)이 약 200 개 항목보다 큰 경우.

관련 문제