我正在研究根据用户输入的值查询数据库的内容。 例如,用户可以搜索国家(可能是“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 );
希望有足够的清楚,让某人了解我正在尝试做的事情:)
答案 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是否质量很好,因此您最终不会进行多次查询。