programing

null 값에 대한 zure 테이블 저장소 쿼리

powerit 2023. 5. 18. 21:31
반응형

null 값에 대한 zure 테이블 저장소 쿼리

zure 테이블 저장소에 null 값을 쿼리하는 올바른 방법을 아는 사람이 있습니까?제가 읽은 바로는 가능합니다(비록 개발 저장소에서 방지하는 버그가 있지만).그러나 라이브 클라우드 스토리지에서 실행할 때 다음 오류가 계속 발생합니다.

요청 입력 중 하나가 잘못되었습니다.

이것은 제가 정리한 LINQ 쿼리의 덤다운 버전입니다.

var query = from fooBar in fooBarSVC.CreateQuery<FooBar>("FooBars")
        where fooBar.PartitionKey == kPartitionID
            && fooBar.Code == kfooBarCode
            && fooBar.Effective_Date <= kFooBarDate.ToUniversalTime()
            && (fooBar.Termination_Date > kFooBarDate.ToUniversalTime() || fooBar.Termination_Date == null)
        select fooBar;

null을 확인하지 않고 쿼리를 실행하면 정상적으로 작동합니다.가능한 해결책은 이 쿼리가 반환하는 컬렉션에서 두 번째 쿼리를 실행하는 것입니다.필요하다면 그렇게 해도 상관없지만, 먼저 이 방법을 사용할 수 있는지 알고 싶습니다.

제가 잘못하고 있는 게 분명해 보이는 사람 있나요?

문제는 zure 테이블 저장소에 스키마가 없기 때문에 null 열이 실제로 존재하지 않는다는 것입니다.이것이 당신의 쿼리가 유효하지 않습니다.테이블 저장소에는 null 열이 없습니다.정말로 필요하다면 빈 문자열을 저장하는 것과 같은 것을 할 수 있습니다.여기서 근본적인 문제는 Azure 테이블 스토리지가 파티션 키와 행 키 이외의 열에서 쿼리하도록 설계되지 않았다는 것입니다.이러한 비표준 열 중 하나에 대해 쿼리를 수행할 때마다 테이블 스캔이 수행됩니다.많은 데이터를 얻기 시작하면 쿼리 시간 초과 비율이 매우 높아집니다.이러한 유형의 쿼리에 대한 수동 인덱스를 설정하는 것이 좋습니다.예를 들어, 행 키의 값이 서로 다른 동일한 데이터를 같은 테이블에 저장할 수 있습니다.궁극적으로, 당신의 지역 앱이 사용률이 높지 않다면, 당신이 하고 있는 쿼리 유형에 훨씬 더 유연하기 때문에 SQL Azure를 사용할 것입니다.

업데이트: Azure는 테이블 스토리지 설계에 대한 훌륭한 가이드를 가지고 있어 제가 읽기를 추천합니다.http://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/

저는 방금 이 문제를 겪었고 실제로 무효를 테스트하기 위한 멋진 닌자 트릭을 발견했습니다.저는 Azure Storage 인터페이스를 직접 사용하고 있지만, 당신이 그렇게 한다면 LINQ에서도 작동할 것이라고 90% 확신합니다.

가격(Int32?)이 null인지 확인하기 위해 수행한 작업은 다음과 같습니다.

not (Price lt 0 or Price gt 0)

저는 당신의 경우에 fooBar를 테스트하여 LINQ에서도 동일한 작업을 수행할 수 있다고 생각합니다.Termination_Date가 DateTime보다 작거나 큽니다.예를 들어 UtcNow.이와 같은 것:

where fooBar.PartitionKey == kPartitionID
  && fooBar.Code == kfooBarCode
  && fooBar.Effective_Date <= kFooBarDate.ToUniversalTime()
  && (fooBar.Termination_Date > kFooBarDate.ToUniversalTime()
  || (not (fooBar.Termination_Date < DateTime.UtcNow 
            or fooBar.Termination_Date > DateTime.UtcNow))
select fooBar;

MyColumn이라는 문자열 열에 대해 다음을 입력할 수 있었습니다.not(MyColumn gt '')

위의 Mike S 답변은 저를 올바른 길로 이끌었습니다.

문자열의 경우 빈 문자열과 비교할 수 있습니다.

IsNotBlank(value) 

가능:

(Value gt '') 

.NET용 AzureTables 클라이언트 라이브러리를 사용하여 쿼리nullGUID 값.

샘플 코드에서 속성의 이름은 MyColumn입니다.

var filter = Azure.Data.Tables.TableClient
      .CreateQueryFilter($"not(MyColumn gt {Guid.Empty})");

테이블 클라이언트.CreateQueryFilter 메서드는 다음과 같이 필터를 생성합니다.

not(MyColumn gt guid'00000000-0000-0000-0000-000000000000')

언급URL : https://stackoverflow.com/questions/4228460/querying-azure-table-storage-for-null-values

반응형