我想做的就是正确地声明var place
,所以一旦我到达foreach
循环,它仍然在范围内。我假设我需要在connections
的if
声明之前声明它。这是一个正确的假设吗?如果是,我如何声明它?谢谢!
using (var db = new DataClasses1DataContext())
{
if (connections == "Connections")
{
var place = (from v in db.pdx_aparts
where v.Latitude != null && v.Region == region && v.WD_Connect >= 1
select new
{
locName = v.Apartment_complex.Trim().Replace(@"""", ""),
latitude = v.Latitude,
longitude = v.Longitude
}).Distinct().ToArray();
}
else
{
var place = (from v in db.pdx_aparts
where v.Latitude != null && v.Region == region && ((v.WD_Connect == null) || (v.WD_Connect == 0))
select new
{
locName = v.Apartment_complex.Trim().Replace(@"""", ""),
latitude = v.Latitude,
longitude = v.Longitude
}).Distinct().ToArray();
}
foreach (var result in place)
....
您可以创建一个包含单个条目的数组,稍后忽略该条目的值:
// Note: names *and types* must match the ones you use later on.
var place = new[] { new { locName = "", latitude = 0.0, longitude = 0.0 } };
if (connections = "Connections")
{
// Note: not a variable declaration
place = ...;
}
else
{
place = ...;
}
这是有效的,因为每次使用具有相同名称和类型的属性,以相同的顺序使用匿名类型,将使用相同的具体类型。
我认为最好让代码只有在它需要的部分有所不同:
var query = v.db.pdx_aparts.Where(v => v.Latitude != null && v.Region == region);
query = connections == "Connections"
? query.Where(v => v.WD_Connect >= 1)
: query.Where(v => v.WD_Connect == null || v.WD_Connect == 0);
var places = query.Select(v => new
{
locName = v.Apartment_complex
.Trim()
.Replace(""", ""),
latitude = v.Latitude,
longitude = v.Longitude
})
.Distinct()
.ToArray();
这里很容易看出,only部分取决于connections
的值是查询中处理WD_Connect
的部分。
您可以将if
转换为?:
。
var place = connections == "Connections" ? monsterQuery1 : monsterQuery2;
我不认为这是一个很好的解决方案,因为你的查询太大(不可读)。
如果引入一个命名为的类来代替匿名类型,情况会好得多。r#在"灯泡菜单"重构中为你做了这些。您可以只使用1查询,因为它们几乎相同,并且只需在where子句
中添加额外的条件var place = (from v in db.pdx_aparts
where v.Latitude != null && v.Region == region
&& connections == "Connections"
? v.WD_Connect >= 1
: ((v.WD_Connect == null) || (v.WD_Connect == 0))
select new
{
locName = v.Apartment_complex.Trim().Replace(@"""", ""),
latitude = v.Latitude,
longitude = v.Longitude
}).Distinct().ToArray();
foreach (var result in place)
....