2016-11-15 124 views
1

我想在相關實體上進行部分屬性匹配的文本搜索。部分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具有以下區域:悉尼,布里斯班,達爾文,那麼我應該能夠搜索「席德」來檢索TradeContact記錄。

目前我正在尋找這樣的:

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

這個代碼是找到完整的比賽,所以「悉尼」將返回我的TradeContact,但它並沒有對部分匹配工作。

我做錯了什麼?

+0

@wudzik這不是該問題的重複。 OP已經知道如何執行比較,他們正在詢問如何使用LINQ在字符串列表上執行比較。更確切地說,他們詢問當前的解決方案有什麼問題,因爲它與部分匹配不匹配。 – Abion47

+0

好吧,直到這個問題得不到解決,這裏是你的工作代碼,並且道歉我不能更好地將它格式化爲一個註釋:'TradeContacts = TradeContacts.Where(s => s.Regions.Any(r => r.Name .ToUpper()。Contains(searchString.ToUpper())));' – Abion47

+0

@wudzik這個問題與你以_any_方式標記爲重複的問題無關。 – Evk

回答

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

這一次不同的是:給我任何地方地區有名稱包含搜索字符串的所有聯繫人。

2

你可以嘗試這樣的事情

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

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

這隻返回找到的第一個結果,而不是所有匹配的實體。 – Abion47

+0

你可以在這種情況下使用 – mybirthname

1

好吧,下面是我張貼的答案之前:

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

當前的代碼是不工作的原因是因爲你執行你的名字的名單,檢查列表確切的Contains檢查匹配,當你想要做的是檢查名稱本身。