1

ここで記事を読んでいました: n-tier Zombie with wcf

次のステートメント「zombieRepository.GetAll().Where(funcComp)」に出くわしました。 をGetAll()返しますIQueryableが、whereステートメントはパラメーターで渡され、実際にはインターフェースをインターフェースとしてFunc<>呼び出します。IQueryableIEnumerable

この呼び出しの問題は、フィルターがdtos.ZombieIncidentSQL サーバー側ではなくクライアント側で行われることです (すべてを読み取ってからフィルターを適用します)。私の理解は正しいですか?

コードスニペット:

var paramStart = Expression.Parameter(typeof(dtos.ZombieIncident), "x");
                Expression<Func<dtos.ZombieIncident, bool>> func = Expression.Lambda<Func<dtos.ZombieIncident, bool>>(
                            Expression.Call(Expression.Property(paramStart,
                                typeof(dtos.ZombieIncident).GetProperty(propertyName).GetGetMethod()),
                                typeof(String).GetMethod(searchType.ToString(), new Type[] { typeof(String) }),
                                new Expression[] { Expression.Constant(searchValue, typeof(string)) }),
                    new ParameterExpression[] { paramStart });

                Func<dtos.ZombieIncident, bool> funcComp = func.Compile();

                foreach (dtos.ZombieIncident zombie in zombieRepository.GetAll().Where(funcComp).ToList())
                {
                    zombies.Add(ZombieIncidentDTOMapper.FromDTO(zombie));
                }
4

1 に答える 1

1

2 つの異なるWhere拡張方法があります。

System.Linq.Enumerable.Where:

  • Func<TSource, Boolean>パラメータを受け入れます
  • メモリ内のコレクションをフィルタリングします

System.Linq.Queryable.Where:

  • Expression<Func<TSource, Boolean>>パラメータを受け入れます
  • データ ソースでコレクションをフィルター処理します

使用している方法がわからない場合は、カーソルをその上に置いて F1 を押します。上記のリンクのいずれかに対応するページに移動します。

于 2013-02-05T05:00:14.410 に答える