LINQ to SQL查询帮助(字符串包含字符串数组中的任何字符串)

时间:2010-09-07 10:37:15

标签: c# linq-to-sql lambda

我一直在用这个撕掉我的头发。我有一系列搜索术语,我正在尝试LINQ to SQL查询来搜索数组中每个项目的字段值。

我到目前为止......

var searchResults = 
    from x in SDC.Staff_Persons
    where staffTermArray.Any(pinq => x.Forename.Contains(pinq))
        || staffTermArray.Any(pinq => x.Surname.Contains(pinq))
        || staffTermArray.Any(pinq => x.Known_as.Contains(pinq))
    orderby x.Surname
    select x;

......但后来

  

本地序列不能在LINQ中使用   到SQL的查询实现   除Contains()之外的运算符   操作

......现在我被卡住了。

如果有人可以提供帮助,我会非常感激。 提前谢谢。

罗布

2 个答案:

答案 0 :(得分:6)

我不确定这是否是最简单的解决方案,但这可行:

var filter = CreateFilter(staffTermArray);

var searchResults = 
    from person in SDC.Staff_Persons.Where(filter)
    orderby person.Surname
    select person;



private static Expression<Func<Staff_Person, bool>> CreateFilter(
    string[] staffTermArray)
{
    var predicate = PredicateBuilder.False<Staff_Person>();

    foreach (var staffTerm in staffTermArray)
    {
       // We need to make a local copy because of C# weirdness.
       var ping = staffTerm;

       predicate = predicate.Or(p => p.Forename.Contains(ping));
       predicate = predicate.Or(p => p.Surname.Contains(ping));
       predicate = predicate.Or(p => p.Known_as.Contains(ping));
    }

    return predicate;
}

您需要PredicateBuilder才能生效。

答案 1 :(得分:-1)

一种选择是在客户端而不是在SQL中进行过滤。您可以通过调用where强制在客户端上评估AsEnumerable()。但是,这意味着在测试匹配之前,表的每一行都会加载到内存中,因此如果搜索只匹配大表中的少量结果,那么它可能会无法接受。

var allPersons = 
    from x in SDC.Staff_Persons
    orderby x.Surname
    select x;

var searchResults = 
    from x in allPersons.AsEnumerable()
    where staffTermArray.Any(pinq => x.Forename.Contains(pinq))
        || staffTermArray.Any(pinq => x.Surname.Contains(pinq))
        || staffTermArray.Any(pinq => x.Known_as.Contains(pinq))
    select x;