linqを使用してC#で汎用の "検索エンジン"を作成しようとしています。私は次のように機能している単純な検索エンジンを持っています。C#でEF 4.1クエリにカラム/プロパティを動的にフィルタリングする
var query = "joh smi";
var searchTerms = query.Split(new char[] { ' ' });
var numberOfTerms = searchTerms.Length;
var matches = from p in this.context.People
from t in searchTerms
where p.FirstName.Contains(t) ||
p.LastName.Contains(t)
group p by p into g
where g.Count() == numberOfTerms
select g.Key;
は、私はそれがより一般的になりたいので、私はこのようにそれを呼び出すことができます。
var matches = Search<Person>(dataset, query, p => p.FirstName, p => p.LastName);
私は、次の限り得ているが、それは、「LINQ式ノードタイプで失敗します「Invoke」はLINQ to Entitiesではサポートされていません。 System.NotSupportedException。
static IEnumerable<T> Find<T>(IQueryable<T> items, string query,
params Func<T, string>[] properties)
{
var terms = query.Split(' ');
var numberOfParts = terms.Length;
foreach (var prop in properties)
{
var transformed = items.SelectMany(item => terms,
(item, term) => new { term, item });
// crashes due to this method call
var filtered = transformed.Where(p => prop(p.item).Contains(p.term));
items = filtered.Select(p => p.item);
}
return from i in items
group i by i into g
where g.Count() == numberOfParts
select g.Key;
}
私はそれだけでExpression<Func<T, bool>>
にi => i.FirstName
をコンパイルする方法がなければならない、なんとかだが、私のLINQの専門知識が終わるところだ確信しています。誰にもアイデアはありますか?
)。コンテナ(p.term) – djeebus