2009-07-24 2 views
3

동적 식 API를 사용하는 데 문제가 있습니다. DataTable 필드를 DBNull.Value와 비교할 수 없습니다. API는 "정적 필드 또는 정적 속성 액세스를 지원할 수 있어야합니다. 모든 공개 필드 또는 속성에 액세스 할 수 있습니다."LINQ 동적 식 API, DBNull.Value 비교가있는 조건 자

var whatever = table1.AsEnumerable() 
        .Join(table2.AsEnumerable(), 
        (x) => x.Field<int>("Table1_ID"), 
        (y) => y.Field<int>("Table2_ID"), 
        (x, y) => new { x, y}) 
        .AsQueryable() 
        .Where("x[\"NullableIntColumnName\"] == DBNull.Value"); 

I 오류 치울 : 그러나 다음 쿼리 주어진 "아니오 속성 또는 필드 'DBNull이' '<> f__AnonymousType0`2'형태로 존재하는"

누구나하는 방법에 대한 아이디어를 가지고 이 주변? Submission.Field ("NullableIntColumnName") 문자열을 Where 메서드를 전달할 수 없습니다, btw 또는 다른 DBNull.Value 대신 null 비교할 수 있습니다. 당신이

당신이 소스에보고하셨습니까 USL과 비 대답 죄송합니다

.Where(string.format("x[\"NullableIntColumnName\"] == {0}",DBNull.Value)); 

답변

3

음, 마침내 얻었습니다. cptScarlet은 거의 그것을 가졌습니다.

var values = new object[] { DBNull.Value };  
... 
.Where("x[\"NullableIntColumnName\"] == @0", values); 

또는

.Where("x[\"NullableIntColumnName\"] == @0", DBNull.Value); 
+0

사용자 지정 선택 부분을 사용하기 때문에 해당 솔루션이 작동하지 않습니다. 선택 부분에서 DTO와 같은 사용자 정의 된 객체를 사용하면 열의 유형도 Null 가능합니다. – ahmet

1

어떻게됩니까? 그것도 많지 않습니다. 내 생각 엔 DBNull이 등록 된 루트 객체 목록에 없다는 것입니다.

나는 지금 당장 손을 놓을 소스가 없지만 다른 상수와 비교할 수있는 것이 무엇인지 알려주고 있습니다.

+0

일을 매우 가능성 - {0} 널 (null)로 대체됩니다, 즉 DBNull.Value.ToString()가 –

+0

명확화를 산출 원하든입니다 같이 동적 Linq에 자체있다 파서는 문자열을 passwed로 해석 할 것입니다. Where를 문자열 식으로 구문 분석합니다. –

+0

감사합니다. cptScarlet ... 제가 답변을 찾 자마자 문자열과 params 객체 []를 함께 사용하는 오버로드를 기억했습니다. –

0

하지만 같은 ...와 현재 어디에요를 교체 할 때

0

어디에요 (a => a.IntColName == NULL);

편집 :

미안 해요, 난이 역동적 인 요구 사항을 참조 did't ... 동적은 다음과 같습니다

var intColName = "..."; 
    .Where(string.Format("it.{0} is null", intColName)); 
+0

아니요, 그럴 수 없었습니다. 사용자 입력을 기반으로하는 열 선택이 동적입니다. –

1

(적어도 프레임 워크 4) 당신은 당신에게 다음 x.Field<int>("Table1_ID")x.Field<int?>("Table1_ID")에를 변경하는 경우 ' 정규 정수 대신 널값 (nullable) 정수를 얻게되고 DBNull 값은 간단한 C# 널값으로 변환됩니다. 코드 스 니펫에 기반하여, 나는 심지어 당신이 동적 표현식을 필요로하는지 확신하지 못합니다 - 단순한 .Where(foo => foo.x == null)가 작동해야합니다. 일반적으로

+0

필자는 동적 표현식이 필요했지만 int를 사용하는 것에 대해 요점을 말한 적이 있습니까? type 매개 변수의 경우. –

1

, 당신은 또한 시도 할 수 있습니다 :

.Where("NullableColumnName.HasValue");