2012-09-03 6 views
1

Simple.data로 작업 중이며 대답은 앞에서 설명한 기술이 아니지만 요점을 파악하는 데 도움이됩니다. 구문을 무시하십시오."var"(알고리즘 도움말)에 대한 모범 사례

간단한 쿼리로 데이터베이스를 쿼리하고 있습니다. 그러나 일련의 조건에 따라 쿼리가 변경됩니다.

그래서 예를 들면 (매우 단순한 아마도 5-10 조건)

 var result; 

    if(LoggedAtSelected) 
    { 
     // Condition 1 - Calls Logged after a certain date 
     result = db.Jobs.FindAll(db.Jobs.Logged_At >= startDate); 
    } 
    else 
    { 
     // Condition 2 - Calls Closed after a certain date 
     result = db.Jobs.FindAll(db.Jobs.Closed_At >= startDate && dd.Jobs.Closed_At <= endDate); 
    } 

    foreach(var JobRecord in result) 
    { 
    } 

이 상기 이상적인 코드이지만, 안타깝게도이 VAR의 동적 바인딩 가변 특성상 불가능하다. 이런 상황에 가장 적합한 방법은 무엇입니까? 내 유일한 생각은 모든 조건에 대해 "var result = condition ..."을 작성하고 if..else if..else에 해당 유형으로 변환 한 후 전역 변수에 할당하는 것입니다. 그리고 나서 그것을 "foreach"에서 사용합니다. 많은 일을합니다. 어떤 아이디어? 아니면 그게 !!! !!! !!!

+3

'var'의 실제 유형은 무엇입니까? 그걸 사용하니? – RvdK

+0

'var'은'result' 동적을 만들지 않습니다. 정적으로 타입이 지정되어 있습니다. 그냥 형식을 쓰지 않아도됩니다. PoweRoy가 말했듯이, 당신이 원하는 타입을 결정하십시오. 'IEnumerable '과'result'를 그 타입으로 선언하십시오. –

+0

@MarkPattison -'JobRecords'는 ​​각 항목의 변수 이름입니다 ... – Oded

답변

6

대신 : 컴파일러가 사용 정확히 유형 (또는를 정의하는 방법을 알 수있는 경우

IEnumerable<Job> result; 
+0

Oded 감사합니다. Simple.Data가 IEnumerable (어딘가 알고 있어야 함)에 사용할 "정적"형식을 제공 할 수 있는지 알아봐야합니다. 그러나 나는 대답을 썼습니다 : –

+0

예, Simple.Data는 T의 속성 이름이 테이블의 열 이름과 대략 일치하는 한 FindAll에서 결과를 자동으로 IEnumerable 으로 캐스팅합니다. –

0

당신은 VAR를 사용할 수 있습니다

var result; 

db.Jobs.FindAll에 의해 반환되는 실제 유형을 사용 당신을위한 새로운 유형).

var result = new List<Job>; 

(물론 쿼리가 IEnumarable 인스턴스를 대신 반환합니다 귀하의 경우

당신은

List<Job> result; 

을 말하는 유형을 정의하거나 인스턴스를 반환하는 생성자를 호출 할 수 있습니다 목록의 인스턴스를 만들 수 없기 때문에 List를 예제로 사용했습니다.

+0

'new List ();'에 대한 필요가 없으므로 변수가 나중에 확실히 할당됩니다. – Oded

+0

@Oded 필자는 샘플 코드로 사용하여 컴파일러에서 사용할 형식을 알려주는 방법을 보여주었습니다. –

0

if 문이 쿼리 필터를 결정하는 것처럼 쿼리 자체가 아니라 SimpleExpression을 구축하고 나중에 쿼리를 실행할 수 있습니다. 예를 들어.

var whereCLause; 

if(LoggedAtSelected) 
{ 
    // Condition 1 - Calls Logged after a certain date 
    whereClause = db.Jobs.Logged_At >= startDate; 
} 
else 
{ 
    // Condition 2 - Calls Closed after a certain date 
    whereClause = db.Jobs.Closed_At >= startDate && dd.Jobs.Closed_At <= endDate; 
} 

List<Job> results = db.Jobs.All.Where(whereClause); 
foreach(Job record in results) 
{ 
    ... 
} 
관련 문제