开发者

LINQ: Build a where clause at runtime to include ORs ( || )?

I need to build a where clause at runtime but I need to do an OR with the where clause. Is this possible?

Here is my code. Basically "filter" is a enum Bitwise, son hence filter could be equal to more than 1 of the following. Hence I need to build up the where clause.

If I execute the WHEREs separately then imagine if I do the Untested first, and it returns 0 records that means I can't execute a where on the Tested because its now 0 records.

I will put some pseudo-code below:

        string myWhere = "";

        if ((filter & Filters.Tested) == Filters.Tested)
        {
       开发者_C百科      if (myWhere != "" ) myWhere =myWhere + "||";
             myWhere = myWhere " Status == "Tested";

        }

        if ((filter & Filters.Untested) == Filters.Untested)
        {
             if (myWhere != "" ) myWhere =myWhere + "||";
             myWhere = myWhere " Status == "Untested";
        }

        if ((filter & Filters.Failed) == Filters.Failed)
        {
             if (myWhere != "" ) myWhere =myWhere + "||";
             myWhere = myWhere " Status == "Failed";
        }

        // dataApplications = a List of items that include Tested,Failed and Untested.

        // dataApplication.Where ( myWhere) ---  Confused here!  

Is this possible?

I don't want to include lots of "IFs" because there are lots of combinations i.e. no filter, filter= tested Only, filter = Untested and Tested ... and lots more.


If you have this:

IEnumerable<MyType> res = from p in myquery select p;

You can define a

var conditions = new List<Func<MyType, bool>>();

conditions.Add(p => p.PropertyOne == 1);
conditions.Add(p => p.PropertyTwo == 2);

res = res.Where(p => conditions.Any(q => q(p)));

And now the trick to make Lists of Funcs of anonymous objects (and you can easily change it to "extract" the type of anonymous objects)

static List<Func<T, bool>> MakeList<T>(IEnumerable<T> elements)
{
    return new List<Func<T, bool>>();
}

You call it by passing the result of a LINQ query. So

var res = from p in elements select new { Id = p.Id, Val = p.Value };
var conditions = MakeList(res);


var statusTexts = new List<string>(); // Add desired status texts
dataApplication.Where(item =>
        statusTexts.Any(status => item.Status == status))


Use HashSet<> for statuses, then .Contains will be O(1) instead of usual O(n) for List<>:

var statuses = new HashSet<string>() {"a", "b", "c"};
var list = new[] {
    new {   Id = 1, status = "a"},
    new {   Id = 2, status = "b"},
    new {   Id = 3, status = "z"}
};

var filtered = list.Where(l => statuses.Contains(s => l.status == s));
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜