LINQ / Projection - 包含用于过滤的所有通配符

时间:2011-12-08 17:14:45

标签: c# linq linq-to-sql contains

Contains(“”)是否有等效的“* ”?我正在使用一些通配符进行过滤,如果没有应用过滤器,那么我需要全部返回?

string[] filter = {1,2};  // This is dynamic could be filtered values or {} empty.

// This works for filtering by products (1,2)
db.Products.Where(x => filter.Contains(x.ProdId));

我真正需要实现的是:

// If the filter is empty get all results...if there is a filter passed the filter values in for select
db.Products.Where(x => x.ProdId.Contains(filter.Length == 0 ? "*" : filter);

3 个答案:

答案 0 :(得分:3)

如果需要,您可以添加地点:

var query = db.Products.AsQueryable();
if (filter.Any())
    query = query.Where(x => filter.Contains(x.ProdId));

// use query as needed

答案 1 :(得分:1)

使用此:

var result = db.Products.AsQueryable();

if(filter.Any())
    result = result.Where(x => filter.Contains(x.ProdId));

如果过滤器不是唯一的条件,那根本不是问题,您可以为查询定义多个Where

var result = db.Products.Where(x => SomeCondition(x));

if(filter.Any())
    result = result.Where(x => filter.Contains(x.ProdId));

答案 2 :(得分:0)

db.Products.Where(x => !filter.Any() || filter.Contains(x.ProdId))

虽然我喜欢列出的其他答案:

if(filter.Any()) result = result.Where(x => filter.Contains(x.ProdId));

在第一个示例中,它将遍历集合并确定过滤器确实具有结果中每个项目的项目。如果过滤器中有项目

,则第二个仅循环