English 中文(简体)
Linq-Sql IQueryable<T> and chaining OR operations
原标题:

I m trying to simulate:

WHERE x.IsActive = true OR x.Id = 5

The following causes AND to be used... how do I simulate an OR condition with IQueryable (qry) and my nullable int, given that other filtering might be involved as with the IsActive filter here?

            if (onlyActiveItems) //bool
            {
                qry = qry.Where(x => x.IsActive == true);
            }

            if (whenSpecifiedMustIncludeRecordWithThisId.HasValue) //int?
            {
                qry = qry.Where(x => x.Id == whenSpecifiedMustIncludeRecordWithThisId.Value);
            }

I have considered union but its seems the answer to this should be much simpler.


This is one solution which gets around the problem I get with "Nullable object must have a value" when trying the combined all in one answer. What causes the nullable to be evaluated when it is null otherwise?

            if (whenSpecifiedMustIncludeRecordWithThisId.HasValue)
            {
                qry = qry.Where(x => (!onlyActiveItems || (onlyActiveItems && x.IsActive)) || x.Id == whenSpecifiedMustIncludeRecordWithThisId.Value);
            }
            else
            {
                qry = qry.Where(x => (!onlyActiveItems || (onlyActiveItems && x.IsActive)));
            }

It seems also in some cases the use of the nullable s .Value property makes a difference as seen in another question of mine here Linq to SQL Int16 Gets Converted as Int32 In SQL Command

最佳回答

Try this:

qry = qry.Where(x => (onlyActiveItems
                      ? x.IsActive
                      : false) ||
                     (whenSpecifiedMustIncludeRecordWithThisId.HasValue
                      ? x.Id == whenSpecifiedMustIncludeRecordWithThisId
                      : false) ||
                     (!onlyActiveItems && !whenSpecifiedMustIncludeRecordWithThisId.HasValue));

Note that we re comparing an int? to an int, not two ints.

I am assuming here that the point of the query is to filter out if certain conditions are met.

  • If onlyActiveItems is true, it verifies whether the IsActive field is true
  • If whenSpecifiedMustIncludeRecordWithThisId.HasValue is true it verifies whether the value matches the Id field
  • If both are true it will logically OR the conditions
  • If both are false all records are displayed (if this is not the intent, you can remove the last condition)
问题回答

When working with "int?" I usually compare them using object.Equals(i1, i2), for example

from r in cxt.table
where object.Equals(r.column, nullableInt)
select r

This avoids all nullable issues.





相关问题
IQueryable into a hierarchy

I currently have an IQueryable of Questions. In my Question object I have and "id" and a "parentId" which can be used to create a hierarchy. Currently, I bind a RadTreeView to the IQueryable of ...

sorting of an Iqueryable

I have an IQueryable with duplicate entries and I want to sort this IQueryable by the count of occurrences.

Determine the position of an element in an IQueryable

I have a IQueryable which is ordered by some condition. Now I want to know the position of a particular element in that IQueryable. Is there a linq expression to get that. Say for example there are ...

Linq-Sql IQueryable<T> and chaining OR operations

I m trying to simulate: WHERE x.IsActive = true OR x.Id = 5 The following causes AND to be used... how do I simulate an OR condition with IQueryable (qry) and my nullable int, given that other ...

Linq, Where Extension Method, Lambda Expressions, and Bool s

Greetings, I am having some issues with using a bool operation within a Where clause extension method of an IQueryable object obtained using Linq to Entities. The first example is showing what does ...

Linq - How to turn IQueryable<IEnumerable> into IQueryable

I have a simple linq statement that isn t quite returning what I would like. I understand why, I just don t know how to wriet it to get what I want. The query is as follows: answers = from a in ents....

热门标签