C # Lambda .Contains () для нескольких свойств - PullRequest
6 голосов
/ 12 февраля 2011

Мы используем следующее для создания поискового запроса (используя NHibernate).

GetAll(x => x.Username.ToUpper().Contains(SEARCH)).ToList();

Можно ли выполнить поиск (содержит) по нескольким свойствам, что-то вроде ...

    GetAll(x => x.Username.ToUpper().Contains(SEARCH) 
        && x => x.Firstname.ToUpper().Contains(SEARCH) 
        && x => x.Lastname.ToUpper().Contains(SEARCH)).ToList();

Использование C #

Ответы [ 2 ]

6 голосов
/ 12 февраля 2011
GetAll(x => x.Username.ToUpper().Contains(SEARCH) 
        && x.Firstname.ToUpper().Contains(SEARCH) 
        && x.Lastname.ToUpper().Contains(SEARCH)).ToList();

Полагаю, вы захотите выполнить поиск ИЛИ:

GetAll(x => x.Username.ToUpper().Contains(SEARCH) 
        || x.Firstname.ToUpper().Contains(SEARCH) 
        || x.Lastname.ToUpper().Contains(SEARCH)).ToList();
0 голосов
/ 17 января 2014

Попробуйте NinjaNye.SearchExtensions .

Это позволит использовать следующий синтаксис:

var result = GetAll().Search("search", 
                             x => x.Username, 
                             x => x.Firstname, 
                             x => x.Lastname)
                     .ToList();

При использовании с sql это приведет к следующему:

SELECT [Extent1].[Id] AS [Id], 
       [Extent1].[Username] AS [Username], 
       [Extent1].[Firstname] AS [Firstname], 
       [Extent1].[Lastname] AS [Lastname]
FROM   [dbo].[Users] AS [Extent1]
WHERE ([Extent1].[Username] LIKE N'%search%') 
   OR ([Extent1].[Firstname] LIKE N'%search%') 
   OR ([Extent1].[Lastname] LIKE N'%search%')

... означает, что вся работа выполняется в источнике данных, а не в памяти

Исходный код приведен на странице github:

https://github.com/ninjanye/SearchExtensions

...