У меня возникли проблемы с выполнением поиска. Я пытаюсь найти клиента по имени, фамилии, ссылке или CompanyName. Мне удалось заставить его работать, однако заказ не на 100%.Linq/Lamba Поиск по нескольким строкам
Вот мой исходный объект
var q = from row in DataAccess.metadata.db_Customer
where row.accountID == accountID
&& row.isActive
orderby row.Name
select new bl_customerNames
{
customerID = row.customerID,
CustomerName = row.Name + " " + row.LastName,
Company = row.Company,
Reference = row.reference,
Email = row.Email,
CurrencyCode = row.CurrencyCode,
isSuspended = row.isSuspended
};
Тогда я сделал следующий фильтр.
if (!string.IsNullOrEmpty(search))
{
q = q.Where(x => (x.CustomerName.Contains(search) || x.Reference.Contains(search) || x.Company.Contains(search)));
}
Хотя это делает справедливую работу список не реально сделать логический смысл, поскольку его не благоприятствовать начинается с выше Содержит.
Я тогда придумал решение для ранжирования, где я бы оценил старты с более высоким, чем Содержит.
Вот мой код, который:
var q = from row in DataAccess.metadata.db_Customer
where row.accountID == accountID
&& row.isActive
orderby row.Name
select new bl_customerNames
{
customerID = row.customerID,
CustomerName = row.Name + " " + row.LastName,
Company = row.Company,
Reference = row.reference,
Email = row.Email,
CurrencyCode = row.CurrencyCode,
isSuspended = row.isSuspended,
Rank = ((row.Name + " " + row.LastName).StartsWith(search) || row.reference.StartsWith(search) || row.Company.StartsWith(search)) ? 1 : ((row.Name + " " + row.LastName).Contains(search) || row.reference.Contains(search) || row.Company.Contains(search)) ? 2 : 0
};
Я бы тогда фильтр так:
q = q.Where(r=>r.Rank > 0).OrderBy(r => r.Rank);
Однако, если при поиске по ссылке он не возвращает ничего.
Так что мой вопрос будет мой текущий метод работы также почему ничего не возвращается, если я ищу по ссылке или название компании? Каков был бы правильный способ создания StartsWith, затем Содержит и все еще сохраняет своего рода алфавитный порядок после StartsWith List.
Пожалуйста, имейте в виду, что я все еще младший разработчик, и любая помощь будет оценена по достоинству.
В чем вопрос? – MichaelThePotato
Я изменил свой вопрос. –
попробуйте помещать фильтрацию и заказывать в исходном запросе ИЛИ вызывать 'ToList()' на нем перед применением фильтрации (просто догадка) – slawekwin