我有我的searchString,想要通过一些属性(Name,PhoneNumber,EmailAddress等)在db表中搜索。但我需要知道找到searchString的属性。有没有优雅的解决方案? 现在我有许多类似的代码块(对于Name one,对于PhoneNumber one,...),如下所示:
var searchString = "text to search...";
var searchResultItems = new List<SearchResultItem>();
// Search in client names
var clients = db.Clients.Where(x => x.Name.Contains(searchString)); // db context
foreach (var client in clients)
{
var searchResultItem = new SearchResultItem()
{
ResultLabel = client.Name,
SearchResultType = SearchResultType.ClientName,
};
searchResultItems.Add(searchResultItem);
}
答案 0 :(得分:1)
您可以以更紧凑的方式编写它,同时从性能角度来看将是更好的解决方案(因为您将从整个表中选择单个字段):
var nameQuery = db.Clients
.Where(x => x.Name.Contains(searchString))
.Select(x => new SearchResultItem {
ResultLabel = client.Name,
SearchResultType = SearchResultType.ClientName,
});
以类似的方式创建phoneNumberQuery,emailAddressQuery等。
然后你可以.Concat()
将所有这些片段整理成单个查询:
var = searchResultItems = nameQuery
.Concat(phoneNumberQuery)
.Concat(emailAddressQuery)
.Concat(...)
.ToArray();
你也可以去表达式和写方法,如
IQueryable<SearchResultItem> GetSearchQuery<T>(IQueryable<T> set, Expression<Func<T, string>> fieldSelector, string searchString, SearchResultType resultType) {
// homework here
}
将根据特定字段生成选择查询,但在您的具体情况下,我认为不值得。