【问题标题】:Contains method for comparing in multiple table包含在多个表中进行比较的方法
【发布时间】:2014-10-13 05:15:09
【问题描述】:

我首先使用 EF 代码。两张桌子。

公司表(字段:CompanyName)和标签表(TagName)。公司表有指向标签表的链接

    public class Company   
    {
     public int Id { get; set; }
     public string CompanyName { get; set; }
     public virtual ICollection<Tags> Tags { get; set; }
    }

我想检索 CompanyName 包含已传递字符串的所有公司,并检索所有具有该字符串作为标签的公司

        var result = from c in _db.Company
                     select new CompaniesVM  
                     {
                         Id = c.Id,
                         CompanyName = c.CompanyName
                     };

        if (!String.IsNullOrEmpty(searchString))
        {
            result = result.Where(s => s.CompanyName.Contains(searchString));
        }

我的数据库包含:

公司名称:test1

公司名称:公司测试

如果我使用 searchString "test" 运行代码,它只会捕获第一条记录。 Contains 方法不捕获第二条记录。这是为什么?如何捕获所有带有“test”字符串的记录?

如果我有 TagName "test"

公司名称:ABC Inc. 标签:TagName : test

如何查看标签表并获得公司?

我在下面使用多对多示例架构

我可以在一个查询中完成所有操作吗?也许使用延迟加载方法?

如果您能指出类似的示例或示例代码,我们将不胜感激

【问题讨论】:

  • 第二家公司是“测试”还是“测试”?
  • 都是小写的“test”
  • @artm 你是对的我重新检查它不是小写。哎呀。你知道怎么查看Tag表中的记录吗?
  • 标签表还是标签列?从您的示例看来,标签是同一张表中的另一列,然后执行result.Where(s =&gt; s.CompanyName.Contains(searchString) || s.TagName.COntains(SearchString))
  • @artm 它是一个标签表。 company 表有一个指向 Tag 表的链接

标签: linq entity-framework ef-code-first


【解决方案1】:

Contains 区分大小写,因此如果您的数据为大写且您的 searchTerm 为小写,则它们将不匹配。如果您想在搜索时忽略大小写,请使用result.Where(s =&gt; s.CompanyName.ToLower().Contains(searchString.ToLower()))。要搜索 Tag 表以及 Company 表,请加入它们

from c in _db.Company
join t in _db.Tag on c.field equals t.field
select new { Companyname = c.CompanyName, TagName = t.TagName}
where !String.IsNullOrEmpty(search) && (c.CompanyName.Contains(search) || t.TagName.COntains(search)

更新多对多,因为您在公司上有收藏:

from c in _db.Company
select new {
     CompanyName = c.CompanyName
}
where !string.IsNullOrEmpty(search) 
      && (c.CompanyName.Contains(search) || c.Tags.Any(t => t.TagName.Contains(search))

【讨论】:

  • 我已经更新了我的问题,请看,我想我不必提到它是多对多的,所以我不能直接加入。我需要创建 2 个单独的查询吗?或者以某种方式我可以一举两得?使用延迟加载?感谢您的帮助
  • 感谢 Artm 作品!你能解释一下 c.Tags.Any(t => t.TagName.Contains(search) 有效吗?为什么包含 Any() 为什么它不能只与 Contains() 方法一起使用?
  • 查看 Any 定义,Any 将检查 c 中的所有标签是否包含条件,如果任何标签包含搜索关键字,则返回 true。 msdn.microsoft.com/en-us/library/vstudio/…
  • 关于区分大小写:查询在数据库中运行,因此查询是否区分大小写取决于数据库排序规则。通常,数据库列不区分大小写。
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 2012-01-06
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多