我尝试对相关实体的部分属性匹配进行文本搜索。
我的实体是:
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,但它不适用于部分匹配。
我做错了什么?
答案 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
检查,这会检查列表中的完全匹配项,当您要执行的操作是检查名称本身时