使用Contains搜索部分linq文本

时间:2016-11-15 06:49:51

标签: c# asp.net linq

我尝试对相关实体的部分属性匹配进行文本搜索。

我的实体是:

public class TradeContact
{
    [Key]
    public int TradeContactId { get; set; }

    public virtual ICollection<Region> Regions { get; set; }

}

public class Region
{
    [Key]
    public int RegionId { get; set; }
    public virtual ICollection<TradeContact> TradeContacts { get; set; }
}

我的目标是,如果TradeContact拥有以下区域:悉尼,布里斯班,达尔文,那么我应该能够搜索到&#39; Syd&#39;检索该TradeContact记录。

目前我这样搜索:

TradeContacts = TradeContacts
    .Where(s => s.Regions.Select(x => x.Name.ToUpper())
    .Contains(searchString.ToUpper()));

此代码可找到完整匹配,因此&#39;悉尼&#39;将返回我的TradeContact,但它不适用于部分匹配。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情

var result = TradeContacts.Where(s => s.Regions.
             Any(x => x.Name.ToUpper().Contains(searchString.ToUpper()));

if(result!=null)
//do your stuff.

答案 1 :(得分:2)

了解为什么当前的方法不起作用非常重要。

TradeContacts
.Where(s => s.Regions.Select(x => x.Name.ToUpper())
.Contains(searchString.ToUpper()));

如果将其翻译为人类语言,则为:给我一个联系人,其中区域包含区域,名称​​等于搜索字符串。因此,您使用的不是String.Contains,而是IEnumerable.Contains

var regionNames = new List<string>();
var match = regionNames.Contains(searchString);

如您所见,只有在区域名称​​等于您的搜索字符串时才会匹配。

TradeContacts.Where(s => s.Regions.
   Any(x => x.Name.ToUpper().Contains(searchString.ToUpper()));

这个是不同的:给我所有联系人,其中任何地区都有名称 包含 searchString。

答案 2 :(得分:1)

好的,这是我之前发布的答案:

TradeContacts = TradeContacts.Where(
            s => s.Regions.Any(
                r => r.Name.ToUpper().Contains(searchString.ToUpper())));

您当前代码无效的原因是您正在对名单列表执行Contains检查,这会检查列表中的完全匹配项,当您要执行的操作是检查名称本身时