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.
If you're using a named type, just declare a variable with that type before the if
, but then the question would be trivial.
So I assume you're selecting an anonymous type, so you can't explicitly declare a variable with that type.
Cast by example would work here. But that doesn't feel like a good solution. Probably creating a named type is a better idea.
var myObject =Enumerable.Empty<RowType>.Select(row=>select new {columnA, columnB, columnC});
if(city == "New York City")
{
myObject= from x in MyEFTable
where x.CostOfLiving == "VERY HIGH"
select select new {columnA, columnB, columnC};
}
else
{
myObject = from x in MyEFTable
where x.CostOfLiving == "MODERATE"
select select new {columnA, columnB, columnC};
}
Or in your specific example one could project only after the conditional:
IQueryable<RowType> partialQuery;
if(city == "New York City")
partialQuery=MyEFTable.Where(x=>x.x.CostOfLiving == "VERY HIGH");
else
partialQuery=MyEFTable.Where(x=>x.x.CostOfLiving == "MODERATE");
var myObject=partialQuery.Select(x=>x.new {columnA, columnB, columnC});
Or:
Expression<Predicate<RowType>> filter;//Note that this is an Expression, not just a delegate
if(city == "New York City")
filter=x=>x.x.CostOfLiving == "VERY HIGH";
else
filter=x=>x.x.CostOfLiving == "MODERATE";
var myObject=MyEFTable.Where(filter).Select(x=>x.new {columnA, columnB, columnC});
Or even just:
string s;
if(city == "New York City")
s="VERY HIGH";
else
s="MODERATE";
var myObject=MyEFTable.Where(x=>x.CostOfLiving == s).Select(x=>x.new {columnA, columnB, columnC});
Which one is appropriate depends on how you simplified your question.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With