MVC LINQ - поиск / запрос текста с Содержит в связанной таблице - PullRequest
0 голосов
/ 07 января 2019

У меня есть представление, отображающее пользователей. В этом списке значения столбцов взяты из трех таблиц. Стандартная таблица Users из приложений mvc, таблица Persons, которая представляет собой набор дополнительной информации к таблице Users (Persons.UserId = Users.Id), и у меня есть таблица Companies, на которую ссылаются некоторые лица (Person.CompanyId = Company .Я бы). У некоторых лиц нет связанных компаний.

Итак, у меня есть это заявление Linq, которое возвращает всех людей на мой взгляд:

var query = from user in db.Users
            join person in db.Persons on user.Id equals person.UserID
            join company in db.Companies on person.CompanyId equals company.ID into companyResult
            from company in companyResult.DefaultIfEmpty()
            select new PersonIndexItem { ID = person.ID, Name = user.FullName, Phone = user.PhoneNumber, Email = user.Email, Company = company == null ? "" : company.Name };

Это прекрасно работает, у меня есть все мои пользователи и пользователи, которые не имеют отношения к компании, просто не имеют ничего в столбце компании.

На мой взгляд, у меня есть окно поиска, которое соответствует большей части отображаемого поля. Это оператор linq, который я использую:

var query = from user in db.Users where user.FullName.Contains(searchString) || user.Email.Contains(searchString) || user.PhoneNumber.Contains(searchString)
            join person in db.Persons on user.Id equals person.UserID
            join company in db.Companies on person.CompanyId equals company.ID into companyResult
            from company in companyResult.DefaultIfEmpty()
            select new PersonIndexItem { ID = person.ID, Name = user.FullName, Phone = user.PhoneNumber, Email = user.Email, Company = company == null ? "" : company.Name };

Это прекрасно работает, если я наберу строку, она будет возвращать все записи, которые содержат эту строку в имени пользователя, телефоне или электронной почте.

Но я бы хотел добавить поиск в Компанию (Имя), поэтому, если я введу название компании, я получу всех пользователей из этой компании.

Я просто не могу заставить это работать. Есть идеи?

РЕДАКТИРОВАТЬ Для тех, кто интересуется, структура данных выглядит следующим образом:

// Users table
class User
{
  int Id;
  string FullName;
  string Email;
  string PhoneNumber;
}
// Persons table
class Person
{
  int Id;
  int UserId;     // Users table
  int CompanyId;  // Companies table
}
// Companies table
class Company
{
  int Id;
  string Name;
}

1 Ответ

0 голосов
/ 07 января 2019

Я понял, что это может быть невозможно только с одним запросом. Вместо этого я сделал два запроса и объединил их. Полученный результат получен без дубликатов.

var query = from user in db.Users where user.FullName.Contains(searchString) || user.Email.Contains(searchString) || user.PhoneNumber.Contains(searchString)
            join person in db.Persons on user.Id equals person.UserID
            join company in db.Companies on person.CompanyId equals company.ID into companyResult
            from company in companyResult.DefaultIfEmpty()
            select new PersonIndexItem { ID = person.ID, Name = user.FullName, Phone = user.PhoneNumber, Email = user.Email, Company = company == null ? "" : company.Name };

var query2 = from user in db.Users
             join person in db.Persons on user.Id equals person.UserID
             join company in db.Companies on person.CompanyId equals company.ID into companyResult
             from company in companyResult.DefaultIfEmpty() where company.Name.Contains(searchString)
             select new PersonIndexItem { ID = person.ID, Name = user.FullName, Phone = user.PhoneNumber, Email = user.Email, Company = company == null ? "" : company.Name };

var resultUnion = query.Union(query2);

Если у кого-то есть лучшее решение, дайте мне знать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...