基于列表的Or的数量

时间:2011-01-18 05:57:56

标签: c# linq linq-to-sql

我正在研究根据用户输入的值查询数据库的内容。 例如,用户可以搜索国家(可​​能是“Au”),任何包含“Au”的国家都将被返回。

问题是我需要能够在Predicate中添加一堆'或'语句来实现这个结果,但不知道如何去做。

现在,我有

List<int> ids;
ids = (from d in DTDC.Countries
       where d.Name.ToLower().Contains( country.ToLower() )
       select d.CountryID).ToList();

var SearchPredicate = PredicateBuilder.True<DLC>();

// Example
searchPredicate = searchPredicate.And(c => c.CountryID == 0 || c.CountryID == 1 );

所以我需要生成

searchPredicate = searchPredicate.And(c => c.CountryID == 0 || c.CountryID == 1 );

此语句取决于从我的LINQ查询返回的List中的值。

例如,如果列表的值为0,1,7,则查询需要

searchPredicate = searchPredicate.And(c => c.CountryID == 0 || c.CountryID == 1 || || c.CountryID == 7 );

希望有足够的清楚,让某人了解我正在尝试做的事情:)

3 个答案:

答案 0 :(得分:1)

这是In方法的完整实现。你可以选择其中一些。

public static class Ext
{
    public static bool In<T>(this T val, params T[] values)
    {
        return val.In(EqualityComparer<T>.Default, values);
    }

    public static bool In<T>(this T val, EqualityComparer<T> comparer, params T[] values)
    {
        foreach (var v in values)
        {
            if (comparer.Equals(val, v)) return true;
        }
        return false;
    }

    public static bool In<T>(this T val, Func<T, T, bool> comparer, params T[] values)
    {
        foreach (var v in values)
        {
            if (comparer(v, val)) return true;
        }
        return false;
    }
}

用法:

int num = 1;
bool exist = num.In(2, 3, 4, 5);

答案 1 :(得分:0)

不完全确定您要在此处执行的操作..如果列表包含3个元素,是否要生成c => c.CountryID == 0 || c.CountryID == 1 || c.CountryID == 2

如果是这样,为什么不呢(c.CountryID&lt; ids.Count)?

另外,如果您执行的查询只返回1个国家/地区,您确定要在countryID == 0上过滤它吗?

答案 2 :(得分:0)

如果您想要过滤更多内容,为什么要创建List?而是返回IQueryable,然后您可以对其应用更多过滤器...例如:

public IQueryable<Country> GetAllCountries()
{
    return from d in DTDC.Countries select d;
}

然后您可以使用IQueryable<Country>的扩展方法:

public static class CountryFilters
{
    public static IQueryable<Country> ThatContainsName(this IQueryable<Country> query, string country)
    {
        return query.Where(y => y.Name.ToLower().Contains(country.ToLower()));
    }
}

为此,您可以添加更多过滤器,并在过滤查询后持续使用,以提取您的ID。

此外,在应用这些过滤器时,我会检查生成的sql是否质量很好,因此您最终不会进行多次查询。