views:

247

answers:

2

I understand that the C# keyword var implies the type at compile time and therefore requires the declaration and assignment in the same place, making the following construct illegal:

var something;

if (condition)
{
    something=1;
}
else
{
    something = 0;
}

Even though the C# compiler could principally determine that all assignments in the current scope result in the same type, it (presently) does not and therefore generates a compile time error.

In using var with LINQ, I sometimes want to initialize my result variable slightly differently depending on program conditions. The approach I have found is to use the ?: operator, as in:

var participants = (email == null ?
                   (from part in db.Participant
                    where part.SequenceNumber == seqNr
                    select part)
                   :
                   (from part in db.Participant
                    where part.EmailAddress == email
                    select part));

That works well enough if I just have two possible assignments, but quickly becomes unwieldy if there are multiple possible assignments.

Is there a more elegant approach to this?

+7  A: 

You could use .Where(...) rather than query syntax:

var participants = email == null
    ? db.Participant.Where(p => p.SequenceNumber == seqNr)
    : db.Participant.Where(p => p.EmailAddress == email);

but personally I simply wouldn't use var here - it doesn't scale beyond 2, but this is a classic "search" pattern. I might use:

IQueryable<Part> query = db.Participant;
if(email != null) query = query.Where(p => p.EmailAddress == email);
if(seqNr != null) query = query.Where(p => p.SequenceNumber == seqNr);
...
// consume query

This allows multiple conditions to be composed (in this case "AND") for a more specific query. You can also do "OR" but it is slightly more complex (unless you use Concat/Union, which is messy).

Marc Gravell
even more it allows you to sort your result differently according to params.
Alexander Taran
Indeed. Dynamic `OrderBy` can work very similarly, but is very tricky to do with query syntax.
Marc Gravell
A: 

This strikes me as a workaround for a database design problem.

I think the more elegant approach would be factoring the code in such a way as to have one method that handles each different program condition.

I.e.:

if (email == null) {
    DoStuffWhenEmailIsNull();
}
else {
    DoStuffWhenEmailIsNotNull();
}
Seth
Except that the "Stuff" is identical in each case, just the means of selecting the result set is different. This approach would lead to either redundant processing code, or just shift the problem to a method used by both of those new methods.
Eric J.