【问题标题】:MVC LINQ - searching/querying text with Contains in related tableMVC LINQ - 在相关表中搜索/查询包含包含的文本
【发布时间】:2023-04-02 15:58:01
【问题描述】:

我有一个显示用户的视图。在该列表中,列值来自三个表。来自 mvc 应用程序的标准用户表,一个 Persons 表,它是用户表(Persons.UserId = Users.Id)的一堆附加信息,我有一个公司表,有些人有参考(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;
}

【问题讨论】:

  • 你试过这样:from user in db.Users where user.FullName.Contains(searchString) || user.Email.Contains(searchString) || user.PhoneNumber.Contains(searchString) || user.Company.Contains(searchString) ...?你能解释一下什么东西不起作用以及怎么做吗?
  • 公司不在用户中。用户指向指向公司的人。这是两个关系:)
  • 嗨,@FrankTKO,您能否发布表结构以获取未来建议的指针?
  • 公司有人员名单还是只有人名

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多