web-dev-qa-db-ja.com

文字列値がnullまたは空ではないLINQ構文

私はそのようなクエリをしようとしています...

query.Where(x => !string.IsNullOrEmpty(x.PropertyName));

しかし、それは失敗します...

だから今のところ、私は以下を実装しています、それは動作します...

query.Where(x => (x.PropertyName ?? string.Empty) != string.Empty);

lINQがこれを処理するより良い(よりネイティブ?)方法はありますか?

[〜#〜] edit [〜#〜]

おpoびします!プロバイダーが含まれていません...これはLINQ to SQLを使用しています

35
Jon Erickson

http://connect.Microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=367077

問題ステートメント
[。 LINQ to SQL。提案された解決策LINQ to SQLのwhere句でstring.IsNullOrEmptyを許可して、これら2つのクエリの結果が同じになるようにします。

var fieldNullOrEmpty =
from item in db.SomeTable
where item.SomeField == null || item.SomeField.Equals(string.Empty)
select item;

var fieldNullOrEmpty2 =
from item in db.SomeTable
where string.IsNullOrEmpty(item.SomeField)
select item;

その他の読書:
1。 DevArt
2。 Dervalp.com
3。 StackOverflow Post

42
RSolberg

これはLinq2Objectsでは失敗しませんが、Linq2SQLでは失敗します。そのため、SQLプロバイダーなどについて話していると想定しています。

その理由は、SQLプロバイダーがラムダ式を処理する方法に関係しています。関数_Func<P,T>_としてではなく、式_Expression<Func<P,T>>_として受け取ります。その式ツリーを取得し、実際のSQLステートメントに変換して、サーバーに送信します。

翻訳者は基本的な演算子を処理する方法を知っていますが、オブジェクトのメソッドを処理する方法を知りません。 IsNullOrEmpty(x)が_return x == null || x == string.empty_に変換されることはわかりません。 SQLへの変換を行うには、明示的に行う必要があります。

15
Brian Genisio

これは、Linq to Objectsで正常に機能します。ただし、一部のLINQプロバイダーでは、クエリの一部としてCLRメソッドを実行するのが困難です。これは、一部のデータベースプロバイダーでは特に当てはまります。

問題は、DBプロバイダーがLINQクエリをデータベースクエリとして移動およびコンパイルし、すべてのオブジェクトがネットワーク経由でプルされないようにすることです。これは良いことですが、時折、述語の柔軟性を制限します。

残念ながら、プロバイダーのドキュメントを確認せずに、プロバイダーで直接サポートされるかどうかを常に正確に知ることは困難です。プロバイダーは比較を許可していますが、文字列チェックは許可していないようです。あなたの場合、これはおそらくあなたが得ることができるのと同じくらい良いアプローチだと思います。 (比較のために "string.Empty"インスタンスを作成すること以外は、IsNullOrEmptyチェックとそれほど違いはありませんが、それはマイナーです。)

2
Reed Copsey