In the simplified code below,
if(city == "New York City")
{
var MyObject = from x in MyEFTable
where x.CostOfLiving == "VERY HIGH"
select x.*;
}
else
{
var MyObject = from x in MyEFTable
where x.CostOfLiving == "MODERATE"
select x.*;
}
foreach (var item in MyObject)
{
Console.WriteLine("<item's details>");
}
The variable MyObject is not accessible outside conditional block. How can I iterate outside the if..else ?
Let's clarify your confusing question. The problem is that you have two local variables, each of which has the same "unspeakable" type -- a sequence of anonymous type.
I would change your specific code like this:
string cost = city == "NYC" ? "HIGH" : "MODERATE";
var query = from row in table
where row.Cost == cost
select new { row.Population, row.Elevation };
However, if you still need to maintain the structure of the code as it is for some reason, you can do it like this:
static IEnumerable<T> SequenceByExample<T>(T t){ return null; }
...
var query = SequenceByExample(new { Population = 0, Elevation = 0.0 } );
if (whatever)
query = ...
else
query = ...
This is a variation on a trick called "cast by example" where you give an example of an anonymous type to a generic method. Method type inference then figures out what the return type is, and uses that as the type of the implicitly typed local. At runtime, it does nothing but create a useless object that then gets discarded quickly.