2013-10-11 2 views
1

dateLabID에있는 where에서 수행하는 다음 LINQ 문이 있습니다.값이 전달되는 경우에만 Where 조건이 전달됩니다.

나는 LABS와 날짜의 목록을 전달하지만 필수는 아니지만 잠재적으로 날짜와 실험실을 전달할 수 있습니다.이 경우 실험실에 대한 결과를 얻고 싶습니다. 그 특별한 실험실에 대해서.

List<dExp> lstDatExp = (from l in ctx.dExp.Include("datLab") 
         where values.Contains(l.datL.Lab_ID) 
          && l.reportingPeriod == reportingPeriod 
         select l).ToList<dExp>(); 

그러나 이것은이없는에서 값이 건네지고 경우 나누기 : 여기

내가 지금 가지고있는 것입니다. 내 where 문이 모두 선택 사항인지 확인하려면 어떻게 변경합니까?

+1

은'당신의 LABS을 values' 있습니까? 일관되게 이름을 지어주십시오. –

답변

5

된 IQueryable하면 단순히 단계에서 조건을 추가 할 수 있습니다

int? reportingPeriod = ...; 

IQueryable<dExp> resultsQuery =   // don't use `var` here. 
     ctx.dExp.Include("datLab"); 

if (values != null) 
    resultsQuery = resultsQuery.Where(exp => values.Contains(exp.datL.Lab_ID)); 

if (reportingPeriod.Hasvalue) 
    resultsQuery = resultsQuery.Where(exp => exp.reportingPeriod == reportingPeriod.Value); 

// additional .Where(), .OrderBy(), .Take(), .Skip() and .Select() 

// The SQL query is made and executed on the line below 
// inspect the string value in the debugger 
List<dExp> results = resultsQuery.ToList(); 
+2

예,이 사람이 이런 식으로하는 것을 잊어 버렸다고 생각합니다. –

+1

은 완벽하게 작동했습니다. 고맙습니다. 나는 여러 줄로 나눌 수 있다는 것을 몰랐다. 확실히이 방법을 읽는 것이 더 쉽다. –

2

는 우리가 할 것은 (l.reportingPeriod == reportingPeriod || reportingPeriod == null)와 같은 것입니다 그래서 당신은 매개 변수가 사용 된 었소 나있는 경우가 뭔가에 대해 그것을 확인 의미 기본 있는지 확인 데이터 베이스.

+0

그럼 다른 값을 사용하는 것이 좋습니다. (l.datL.Lab_ID) || values ​​= null) 메신저에 누락 된 것이없는 한. –

+0

내 의견을 삭제했습니다. 나는 당신의 상태를 잘못 읽었습니다. – Francis

1

쿼리를 수행하기 전에 값이 null인지 확인하고, 그렇지 않은 경우 추가 조건을 수행하지 않아야합니다.

List<dExp> lstDatExp = 
    (from l in ctx.dExp.Include("datLab") 
    where 
     (values == null || values.Contains(l.datL.Lab_ID)) && 
     (reportingPeriod == null || l.reportingPeriod == reportingPeriod) 
    select l).ToList<dExp>(); 

values 또는 reportingPeriod가 null의 경우이 방법들은 기본적으로 선택 사항입니다.

+0

감사합니다. 이제 두 값 (랩 및 reportingPeriod)을 전달할 때 followign 오류가 발생합니다. 형식이 'System.Collections.Generic.List'1'인 요소를 비교할 수 없습니다. 기본 형식 (예 : Int32, String 및 Guid) 및 엔터티 형식 만 지원됩니다. –

3

여기 그렇게하는 방법은 두 가지가 있습니다.

하지만 먼저 식별자로 하나의 소문자 l을 사용하지 마십시오. 그것은 숫자 1과 혼동하기 쉽습니다.보다 일반적으로, str은 yr cde에서 약자를 사용하여 hrdr에서 rd로 mks합니다.

첫 번째 기술 :

var query = from lab in ctx.dExp.Include("datLab") 
      where values == null || values.Contains(lab.datL.Lab_ID) 
      where reportingPeriod == null || lab.reportingPeriod == reportingPeriod 
      select lab; 
var list = query.ToList<dExp>(); 

두 번째 기술 :

IEnumerable<dExp> query = ctx.dExp.Include("datLab"); 
if (values != null) 
    query = query.Where(lab=>values.Contains(lab.datL.Lab_ID)); 
if (reportingPeriod != null) 
    query = query.Where(lab=>lab.reportingPeriod == reportingPeriod); 
var list = query.ToList<dExp>(); 
+0

두 번째 줄에'IEnumerable <>'을 넣고 싶지 않다. 데이터는 DB에서옵니다. –

+0

@HenkHolterman : 좋은 지적입니다. 그렇다면 'IQueryable'. –

관련 문제