[C#] LINQ式のString.IsNullOrWhiteSpace


Answers

この場合、 IQueryable<T>IEnumerable<T>を区別することが重要です。 要するに、 IQueryable<T>はLINQプロバイダによって処理され、最適化されたクエリを提供します。 この変換中に、すべてのC#ステートメントがサポートされているわけではありません。バックエンドの特定のクエリ(SQLなど)に変換できないか、または実装者がステートメントの必要性を予見しなかったためです。

対照的に、 IEnumerable<T>は具象オブジェクトに対して実行されるため、変換されません。 したがって、 IEnumerable<T>で使用可能な構造はIQueryable<T>使用できず、また異なるLINQプロバイダがサポートするIQueryables<T>も同じ機能セットをサポートしていないことがよくあります。

ただし、いくつかの回避策( Philの回答など )があり、これによってクエリが変更されます。 また、より一般的なアプローチとして、クエリの指定を続ける前にIEnumerable<T>に戻すことも可能です。 ただし、これはパフォーマンス上のヒットになる可能性があります(特に、where句など)。 対照的に、変換を扱う場合、パフォーマンスのヒットはクエリに応じて非常に小さく、時には存在しない場合もあります。

したがって、上記のコードは次のように書き直すこともできます:

return this.ObjectContext.BranchCostDetails
    .AsEnumerable()
    .Where(
        b => b.TarrifId == tariffId && b.Diameter == diameter
        || (b.TarrifId==tariffId && !string.IsNullOrWhiteSpace(b.Diameter))
        ||(!b.TarrifId.HasValue) && b.Diameter==diameter
    );

注:このコードは、 Philの回答よりもパフォーマンスに大きな影響を与えます 。 しかし、それは原則を示しています。

Question

私は次のコードを持っています:

return this.ObjectContext.BranchCostDetails.Where(
    b => b.TarrifId == tariffId && b.Diameter == diameter
        || (b.TarrifId==tariffId && !string.IsNullOrWhiteSpace(b.Diameter))
        || (!b.TarrifId.HasValue) && b.Diameter==diameter);

コードを実行しようとすると、このエラーが発生します。

LINQ to Entitiesは、メソッド 'Boolean IsNullOrWhiteSpace(System.String)'を認識せず、このメソッドをストア式に変換することはできません。

どうすればこの問題を解決し、これよりもコードを書くことができますか?




これを使って空白をチェックすることもできます:

!(String.IsNullOrEmpty(b.Diameter.Trim());