まず、EntityFramework
データベースを使用するREST WebAPIがあります。 EDMX
ファイル、エンティティ、リポジトリクラス、APIコントローラなどからコードが生成されます。Linq PredicateBuilderを使用して文字列を連結してテキスト検索を行います
ユーザーはクエリ文字列を使用して条件を追加できるようになりました。LinqKit PredicateBuilder/Linq
db 。
e.g. /api/Users?FirstName_contains=Rog
これは、User.FirstName
メンバーの「Rog」を持つすべてのユーザーを返します。これは、PredicateBuilder
を使用して、適切なという式を動的に構築し、Where
という句としてDbSet
に対して使用します。例えば
:今
var fieldName = "FirstName";
var value = "Rog";
var stringContainsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var parameter = Expression.Parameter(typeof(User), "m");
var fieldAccess = Expression.PropertyOrField(parameter, fieldName);
var fieldType = typeof(User).GetProperty(fieldName, BindingFlags.IgnoreCase | BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public).PropertyType;
var expression = Expression.Lambda<Func<User, bool>>(Expression.Call(fieldAccess, stringContainsMethod, Expression.Constant(value, fieldType))
, parameter)
var andPredicate = PredicateBuilder.True<User>();
andPredicate = andPredicate.And(expression);
var query = Db.Users
.AsQueryable()
.AsExpandable()
.Where(andPredicate);
問題。私は、クライアントがメンバーの構成に基づいて結果を一致させることができるようにしたい。
e.g. /api/Users?api_search[FirstName,LastName]=Rog
すなわち「Rogメール」の試合のためにfirst name + last name
を検索するので、私は「ロジャーのSm」を検索し、最初の名前=ロジャーと姓= Smithの結果を得ることができます。
私はそれは次のようになり流暢使っDbSet
を照会した場合:私は、文字列のメンバーを動的FirstName + " " + LastName
の連結を処理するpredicate/linq
式を作成しているに苦しんでいますどのような
users.Where(u => (u.FirstName + " " + u.LastName).Contains("Rog"));
。
t-sqlにCONCAT関数があるにもかかわらず、私はEF(特にL2SQL)機能がこの変換をサポートしているとは思わない。すべてのエントリを最初に.ToList()でプルし、次にメモリ内の選択を行う必要があります。 – DevilSuichiro
本当にね?私の旅行からは、上記の流暢な例が、 'WHERE FirstName + '+ LastName LIKE'%Rog% ''のT-SQLに変換されることは間違いありません。 –
どうして 'u => u.FirstName.Contains(query)|| u.LastName.Contains(query) '? – haim770