3

私がやりたいのはvar place正しく宣言することだけなので、foreachループに到達した後もスコープ内にあります。ifのステートメントの前に宣言する必要があると思いますconnections。これは正しい仮定ですか?もしそうなら、どのように宣言しますか?ありがとう!

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)
            ....
4

3 に答える 3

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の部分が、を処理するクエリのセクションであることがはるかに簡単にわかりますWD_Connect

于 2013-01-15T23:20:35.350 に答える
2

ifをに変換でき?:ます。

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

クエリが大きすぎる(読めない)ため、これは良い解決策ではないと思います。

匿名型の代わりに使用する名前付きクラスを導入した方がはるかに良いでしょう。R#は、「電球メニュー」リファクタリングでそれを行います。

于 2013-01-15T23:18:20.637 に答える
1

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)
 ....
于 2013-01-15T23:23:56.677 に答える