2013-07-11 70 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