c# - MVC LINQ - 在相关表中使用 Contains 搜索/查询文本

标签 c# asp.net-mvc database linq search

我有一个显示用户的 View 。在该列表中,列值来自三个表。来自 mvc 应用程序的标准用户表,一个 Persons 表,它是用户表 (Persons.UserId = Users.Id) 的一堆附加信息,我有一个 Companies 表,有些人引用了它 (Person.CompanyId = Company 。ID)。有些人没有关联公司。

所以我有这个 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;
}

最佳答案

我意识到仅通过一个查询可能无法做到这一点。我做了两个查询并将它们组合起来。它得到预期的结果,没有重复。

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);

如果有人有更好的解决方案,请告诉我!

关于c# - MVC LINQ - 在相关表中使用 Contains 搜索/查询文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54068508/

相关文章:

mysql - 如何使用分页版本控制检索 MySQL 表行

php - 使用 SQL 和 PHP 检查特定数据是否已在表中

c# - 如何在表之间交换行后正确地重新排序 ID(jQuery 和 ASP.NET MVC4)

c# - 如何在 C# 中打开多个窗体?

jquery - 如何将 ViewBag 值传递给 razor 中的 JavaScript 函数?

asp.net-mvc - 如何像绘制 Ember.TextField 一样绘制 Password 字段?

c# - 基于百分比加权的选择

c# - 真正的自定义OpenFileDialog .NET

c# - 如果 header 不存在,如何获取空值

android - 使用游标从 android 中的谷歌应用引擎查询