2013-01-15 17 views
3

我想要做的就是正確聲明var place,所以一旦我到達foreach循環,它仍然在範圍內。我假設我需要在connectionsif聲明之前聲明它。這是一個正確的假設,如果是的話,我該如何申報?謝謝!正確聲明匿名類型爲數組以正確保持作用域

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) 
      .... 
+1

你可以在'if'摺疊成'where',而是和只有一個查詢?我不認爲你可以在分配給它之前聲明一個匿名類型的變量。 – Blorgbeard

+0

@Blorgbeard可能會阻止SQL Server使用索引。取決於OPs模式。 – usr

+0

@usr我正在使用索引。感謝您注意 –

回答

7

你可以用一個單一的入口,其價值以後忽略創建數組:

// 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(); 

這更容易告訴依賴於該部分connections value是查詢處理WD_Connect的部分。

+1

+1。提前定義類型的巧妙技巧。 –

2

您可以將if轉換爲?:

var place = connections == "Connections" ? monsterQuery1 : monsterQuery2; 

我不認爲這是一個很好的解決方案,因爲您的查詢太大(不可讀)。

如果您引入了命名的類而不是匿名類型,那將會好得多。 R#爲你在「燈泡菜單」重構中做到了這一點。

+1

更改爲使用命名類本身不會*減少大查詢。有更好的方法來處理那個不需要命名類的部分。 –

+1

@JonSkeet我同意,你的回答比較好。更全面。 – usr

1

你可以只使用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) 
.... 
+1

這可能會阻止SQL Server使用索引。取決於OPs模式。它會執行,但性能配置文件可能會更糟。 – usr