找出找到searchstring的数据库属性(使用Entity Framework)

时间:2017-03-15 14:46:53

标签: c# .net entity-framework

我有我的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);
        }

1 个答案:

答案 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
}

将根据特定字段生成选择查询,但在您的具体情况下,我认为不值得。