2017-12-12 16 views
-1

내 요구 사항은 간단하고 매우 일반적입니다. 나는 그것에 대한 답을 찾기 위해 많은 어려움을 겪었지만 수용 가능한 해결책을 얻지 못했습니다.동적 LINQ와 비교할 때 DateTime을 술어의 다른 형식 매개 변수와 함께 사용

내가 EF 6.1을 사용하고 같은 동적 "ABC> '1'& & DEF의 =의 '2'& & GHI = 3 ..."등등 뭔가를 작성되는 술어가있는 테이블을 조회 할입니다. 문제는 데이터 형식으로 DateTime을 사용하고 있다는 것입니다. 적절한 솔루션을 찾으려고했지만 제공된 솔루션 (아래 언급)이 작동하지 않습니다 (ABC, DEF는 DB의 DateTime 유형 인 열 이름입니다).

  1. repository.Where("ABC > DateTime.Parse(...
  2. repository.Where("ABC > @1 && DEF < @2....", listDateTime.ToArray())

생각?

감사합니다.

업데이트 1 : 위의 예제 2 에서처럼 List (listDateTime)을 사용하여 컴파일 타임에 DateTime 매개 변수의 수를 알 수 없습니다.

업데이트 2 : listDateTime은 런타임시 datetime 매개 변수의 값을 저장하는 List<DateTime>의 개체입니다.

업데이트 3 : 질문에 여기에서 인라인으로 질문 한 내용을 묻습니다. here. 유일한 변경 사항은 컴파일 타임에 DateTime 매개 변수 배열 (@ 0, @ 1 ...) 배열 수를 알 수 없습니다.

+1

더 많은 코드를 공유 할 수 있습니까? – Dumisani

+1

여기서 구체적으로 달성하고자하는 것이 무엇인지 명확하게 알 수는 없습니다. 보다 완벽한 예제를 제공 할 수 있습니까? 목록에 샘플 값을 포함시키고 달성하고자하는 샘플'.Where() '술어를 포함 하시겠습니까? – David

+0

당신은 datetimelist와 함께 사용 된 연산자와 컬럼을 제공해야합니다. 즉, List of Expression >을 전달할 수도 있습니다. Linq의 .Where()에서 이것을 사용하는 것은 매우 쉽습니다. – DevilSuichiro

답변

0

나는 그것을 수행하는 적절한 방법이 아니라고 생각합니다. 이 대신 PredicateBuilder을 사용하는 것이 좋습니다. 그러나이 경우 아마도 그런 식으로 시도 할 수 있습니다.

 //Returns "ABC > DateTime(2016,1,1,0,0,0) && ABC < DateTime(2018,1,1,0,0,0)" 
     public static string BuildDateTimeListFilter(string filter,List<DateTime> dateTimeFilterList) 
     { 
      var filterDateTimeByString = dateTimeFilterList.Select(x => string.Format("DateTime({0},{1},{2},{3},{4},{5})", x.Year, x.Month, x.Day, x.Hour, x.Minute, x.Second)).ToArray(); 
      for (int i = 0; i < filterDateTimeByString.Length; i++) 
      { 
       filter = filter.Replace("@" + i, filterDateTimeByString[i]); 
      } 
      return filter; 
     } 

사용법;

 var filterDateTimeByString = new List<DateTime> 
     { 
      new DateTime(2016,01,01), 
      new DateTime(2018,01,01) 
     }; 
     var records = repository.Where(BuildDateTimeListFilter("ABC > @0 && ABC < @1",filterDateTimeByString)).ToList(); 

반환 된 필터 문자열 equilavent;

repository.Where("ABC > DateTime(2016,1,1,0,0,0) && ABC < DateTime(2018,1,1,0,0,0)").ToList(); 
+0

수동으로 매개 변수를 바꾸려면 먼저 매개 변수가 필요한 이유는 무엇입니까? 내 질문의 소스 인 string.Format()을 사용하여 동일한 출력을 얻을 수 있습니다. 작동하지 않습니다. 보기 # 1을보십시오. 코드를 실행 해 보셨습니까? 어쩌면 나는 뭔가를 놓치고있다. –