我試圖在C#中使用linq創建一個通用的「搜索引擎」。我有一個簡單的搜索引擎,其功能和外觀如下所示。使用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表達式節點類型「調用」在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;
}
我敢肯定這是可行的,有剛有要編譯i => i.FirstName
到Expression<Func<T, bool>>
的方式,但是這就是我的LINQ的專業知識結束。有沒有人有任何想法?
這仍然不允許LINQ到實體以擴大表達 P => currentProp(p.item )。載(p.term) – djeebus