1

こんにちは私は述語ビルダーを使用してwhere句を作成しています。エンティティデータソースに対して大文字と小文字を区別して比較していることに気付きました。いくつかの簡単なグーグルは、これがlinqtoentitiesの機能であることを意味します。だから私はするために私のコードを変更しなければなりませんでした

whereClause = whereClause.And(x => x.county.Equals(oSearch.County, StringComparison.OrdinalIgnoreCase ));

以前に行うのではなく

whereClause = whereClause.And(x => x.county == oSearch.County);

問題は、whereclauseの構築に失敗しているように見えることです。

ちなみに、以前は機能していた以下のコードを使用しています。

var tbl = db.tbl_members.AsExpandable().Where(whereClause.Compile());

foreach(モデルのvarアイテム)を実行するコードがあります。クイックビューを使用してモデルを調べると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」で失敗します。

tblMembers = {System.Linq.Enumerable.WhereEnumerableIterator<tbl_members>}

それよりも

  tblMembers = {SELECT [Extent1].[id] AS [id], 
[Extent1].[membership_id] AS [membership_id], 
[Extent1].[membership_type] AS [membership_type], 
[Extent1].[institution] AS [institution], 
[Extent1].[full_name] AS [full_name], 
[Extent1].[address1] AS [address1], 
...

結果に関係なく、以前に表示されたものです。

4

2 に答える 2

1

問題は、linqに次の翻訳があることです

whereClause = whereClause.And(x =>
x.county.Equals(oSearch.County,StringComparison.OrdinalIgnoreCase )

SQLで。あなたが試すことができます:

whereClause = whereClause.And(x => x.county.ToLower()==oSearch.County.ToLower());
于 2012-02-13T10:31:03.280 に答える
0

これを考えると:

tblMembers = {System.Linq.Enumerable.WhereEnumerableIterator<tbl_members>}

誤ってLINQtoObjectsを使用しているようです。PredicateBuilderのコピーが実際に式ツリー(Expression<Func<T, bool>>)またはデリゲート(Func<T, bool>)の観点からのものであるかどうかを確認します。式ツリーを使用する必要があります。

編集:コメントに記載されているように、これは問題です:

var tbl = db.tbl_members.AsExpandable().Where(whereClause.Compile());

これは、式ツリーをデリゲートにコンパイルしてから、を呼び出しEnumerable.Whereます。Compile()電話なし:

var tbl = db.tbl_members.AsExpandable().Where(whereClause);

...最終Queryable.Where的に式ツリーを使用して呼び出すことになります。式ツリーはSQLに変換できます。

于 2012-02-13T11:30:19.553 に答える