2015-12-10 77 views
1

我正在寫一個動態sql查詢的where子句,並帶有兩列'(列表)'樣式規則中的列。循環與自定義類

我可以看到幾次int ID對,如LocationID/ProductID或TransactionID/FeeID。

下面的示例並不需要放置在方法之外的類,然後從那裏的條件刪除重複:

var x = (from DataRow row in expected.Rows 
      select row.ItemArray[0]).Distinct().ToArray() 
    var y = (from DataRow row in expected.Rows 
      select row.ItemArray[1]).Distinct().ToArray(); 
    for (int i = 0; i < x.Length; i++) 
    { 
     com.Parameters.AddWithValue("@x" + i, int.Parse(TIDs[i].ToString())); 
    } 
    for (int i = 0; i < y.Length; i++) 
    { 
     com.Parameters.AddWithValue("@y" + i, int.Parse(ItemIDs[i].ToString())); 
    } 

是優選該樣品,這是較少的重複的,或者是有一個更好的選擇?

public class xy 
    { 
    public int x; 
    public int y; 
    } 
    var xy = (from DataRow row in expected.Rows 
      select new xy() 
      { 
       x = int.Parse(row.ItemArray[0].ToString()), 
       y = int.Parse(row.ItemArray[1].ToString()) 
      }).Distinct().ToArray(); 
    for (int i = 0; i < xy.Length; i++) 
    { 
    com.Parameters.AddWithValue("@x" + i, xy[i].x); 
    com.Parameters.AddWithValue("@y" + i, xy[i].y); 
    } 

雙方還需要對querystring += "@x" + i + ", ";

+1

您可以使用內置的System.Drawing.Point結構而不是製作自己的類。 – David

+0

確實第二個編譯? –

+0

@SamIam當然不是實際代碼中的類和後續代碼不是並排的;除非你指的是一個特定的錯誤,否則該表示是爲了簡潔起見? – user314321

回答

2

循環(一個或多個)他們是不同的查詢。第一個獲得了清單X s和清單Y s。第二個是嘗試以獲得清單XY組合。但由於xy定義爲class而不是struct,因此您將擁有多個具有相同值xy的實例。

如果只獲得了不同的組合是不是一個問題,你能避免使用匿名類型爲使用自定義類(和避免參考平等問題):

var xy = (from DataRow row in expected.Rows 
      select new 
      { 
       x = int.Parse(row.ItemArray[0].ToString()), 
       y = int.Parse(row.ItemArray[1].ToString()) 
      }).Distinct().ToArray(); 
    for (int i = 0; i < xy.Length; i++) 
    { 
    com.Parameters.AddWithValue("@x" + i, xy[i].x); 
    com.Parameters.AddWithValue("@y" + i, xy[i].y); 
    } 

可能得到更好性能與第二種方法,因爲你只枚舉一次源列表,但除非這是一個重要的瓶頸,它可能沒有總體上有所作爲。

1

這取決於xy是否相關。

如果他們不相關,而你只是對他們做同樣的事情,那麼不要把他們放在一個班級。如果適用,您可以考慮將重複代碼放入方法中,但不要將兩個隨機值放入類中。

如果它們是相關的,比如它們是一個點的x和y座標,那麼你應該把它們放到一個類中來表示你的觀點。


在你的情況下,它也看起來像你可能甚至不需要爲他們做一個新的類。他們已經在一個陣列中。

var xy = (from DataRow row in expected.Rows 
     select row).Distinct().ToArray(); 
0

鑑於我最終使用的代碼量,並在運營商使用了不同數量的where子句中的我去

class SqlInHelper 
{ 
    public static string AddTags (DataColumn col) 
    { 
     string colName = col.ColumnName; 
     string addStr = ""; 
     int distinct = (from DataRow row in col.Table.Rows 
        select row[colName]).Distinct().Count(); 
     for(int i=0;i<distinct;i++) 
     { 
      addStr += "@" + colName + i + ", "; 
     } 

     return addStr.Substring(0, addStr.Length - 2); // remove last ", " 
    } 

    public static void AddParams(SqlCommand query, DataColumn col, out bool bValid) 
    { 
     string colName = col.ColumnName; 
     var vals = (from DataRow row in col.Table.Rows 
         select row[colName]).Distinct().ToArray(); 
     if (query.CommandText.Contains("@" + colName + (vals.Length - 1))) { 
      for (int i = 0; i < vals.Length; i++) 
      { 
       query.Parameters.AddWithValue("@" + colName + i, Convert.ChangeType(vals[i], col.DataType)); 
      } 
      bValid = true; 
     } else { 
      bValid = false; 
     } 

    } 
} 

風格上,我認爲這樣可以讓代碼少重複,更快的查詢(在運算符中比較少做),並且更容易理解。