2013-07-11 98 views
2

可以說我對Entity Framework 5 Code First有以下幾個類。我需要爲所有行業或部門搜索一組關鍵字,返回與任何關鍵字匹配的所有潛在客戶。我還需要搜索相同關鍵字的潛在客戶名稱。我堅持的是如何搜索多個關鍵字。Linq中的搜索查詢用EF

主類

public class Lead 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Industry> Industries { get; set; } 
    public virtual ICollection<Division> Divisions { get; set; } 
} 

工業級

public class Industry 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Lead> Leads { get; set; } 
} 

司類

public class Division 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Lead> Leads { get; set; } 
} 

服務/資源庫呼叫

public IQueryable<Lead> GetByKeywords(string keyword) 
    { 
     var result = leadRepository.GetAll().Where 
      (x => x.Industries.Any(i => i.Name == keyword) 
      || x.Divisions.Any(d => d.Name == keyword) 
      || x.Name.Contains(keyword)); 

     return result; 
    } 

以上查詢適用於單個關鍵字。但是,如果我在字符串中包含多個單詞並且要匹配任何單個關鍵字,那麼它就不起作用。

回答

1
public IEnumerable<Lead> GetByKeywords(string[] keywords) 
    { 
     var result = GetAll().Where 
      (x =>x.Industries.Any(i => keywords.Any(kw=>kw==i.Name)) 
      || x.Divisions.Any(d =>keywords.Any(k=>x.Name==k)) 
      || keywords.Any(kew => x.Name.Contains(kew))); 

     return result; 
    } 
+0

這與一個小小的變化(我認爲錯字)工作。該行:x.Divisions.Any(d => keywords.Any(k => k == d.Name))我修改並返回正確的值。 – roadsunknown

+0

碰到一個問題。最後一行。 Lead.Name(x.Name)可以包含多個單詞,並且關鍵字需要與任何單詞匹配。由於Linq不允許你分割一個字符串(使用string.split(''),是否有另一種方式在Linq中做到這一點。 – roadsunknown

+0

我更新了答案 – ethicallogics

0

你需要將你的字符串拆分成一個List並循環每個關鍵字。事情是這樣的......(把我的頭頂部)

IQueryable<Lead> GetByKeywords(string allKeywords) 
{ 
    List<string> keywords = allKeywords.Split(" "); 
    var result = leadRepository.GetAll(); 

    foreach (string keyword in keywords) 
    { 
     result = result.Where 
      (x => x.Industries.Any(i => i.Name == keyword) 
      || x.Divisions.Any(d => d.Name == keyword) 
      || x.Name.Contains(keyword)); 
    } 

    return result; 
} 
+0

感謝@Scottie。我沒有給出答案,因爲我更喜歡Linq的100%解決方案。 – roadsunknown