Попробуйте 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