У меня есть LINQ к запросу ОБЪЕКТА, который вытягивает от таблицы, но я должен смочь создать "нечеткий" поиск типа. Таким образом, я должен добавить, где пункт, который ищет lastname, ЕСЛИ они добавляют критерии в поле поиска (Текстовое поле, CAN быть пробелом---, в этом случае это вытягивает ВСЕ).
Вот то, что я имею до сих пор:
var query = from mem in context.Member
orderby mem.LastName, mem.FirstName
select new
{
FirstName = mem.FirstName,
LastName = mem.LastName,
};
Это вытащит все из Таблицы-участника, которая находится в объекте Объекта.
Затем у меня есть дополнение к логике:
sLastName = formCollection["FuzzyLastName"].ToString();
if (!String.IsNullOrEmpty(sLastName))
query = query.Where(ln => ln.LastName.Contains(sLastName));
Проблема состоит в том, когда кнопка поиска нажимается, ничто не возвращается (0 результатов). Я выполнил запрос против SQL Server, что я ожидаю происходить здесь, и он возвращает 6 результатов.
Это - запрос, который я ожидаю:
SELECT mem.LastName, mem.FirstName FROM Members mem WHERE mem.LastName LIKE '%xxx%'
(когда xxx вводится в текстовое поле),
Кто-либо видит что-то не так с этим?
Править: Зафиксированный Запрос Select. Я имел в виду, чтобы это читало КАК '%xxx %' (НЕ = 'xxx")
Я думаю, вы хотите использовать функцию Contains ()
строкового параметра следующим образом:
var query = from mem in context.Member
where mem.LastName.Contains("xxx")
orderby mem.LastName, mem.FirstName
select new
{
FirstName = mem.FirstName,
LastName = mem.LastName,
};
Я думаю, вы также можете используйте StartsWith ()
и EndsWith ()
, которые будут эквивалентны SQL «xxx%» и «% xxx» соответственно.
Добавьте свой «выбрать новый» в запрос только после того, как вы добавите «Где» пункт.
Следовательно, добавьте предложение select, используя синтаксис вызова объекта, как вы это делали с предложением where.
Непроверено, извините, пожалуйста, за небольшие ошибки, но общая концепция будет такой ....
using( someContent sc = new someContent())
{
var query = sc.Member.OrderBy( i => i.LastName)
.ThenBy( i => i.FirstName);
sLastName = formCollection["FuzzyLastName"].ToString();
if (!String.IsNullOrEmpty(sLastName))
query = query.Where(ln => ln.LastName.Contains(sLastName));
query = query.Select( i => new
{
FirstName = i.FirstName,
LastName = i.LastName,
});
}
SELECT mem.LastName, mem.FirstName FROM Members mem WHERE mem.LastName = 'xxx'
Это означает, что вы хотите, чтобы фамилия была равна 'xxx'. То, что вы пишете в своем сообщении выше, означает, что фамилия должна содержать 'xxx'.
Чтобы получить равенство, вы должны написать:
if (!String.IsNullOrEmpty(sLastName))
query = query.Where(ln => ln.LastName == sLastName);
Возможно, вам стоит посмотреть на ignore case:
if (!String.IsNullOrEmpty(sLastName))
query = query.Where(ln => ln.LastName.Equals(sLastName, StringComparison.InvariantCultureIgnoreCase));