2015-06-24 62 views
0

我想用DbExtensions創建一條SQL語句。我需要用AND和OR構建一個WHERE子句。像這樣的東西DbExtensions - 與AND和OR的位置

SELECT * 
FROM myTable 
WHERE (Field1 LIKE '%a%' OR Field1 LIKE '%b%') 
    AND (Field2 LIKE '%a%' OR Field2 LIKE '%b%') 

我需要從一個循環內做到這一點。

var builder = SQL 
    .SELECT("*") 
    .FROM("myTable") 
    .WHERE(); 

foreach (var field in fields) { 
    foreach (var value in field.values) { 
     builder.AppendClause("WHERE", " OR ", field.columnName + " LIKE {0}", new object[] { "%" + value.Value + "%" }); 
    } 
} 

上面的代碼似乎產生一個SQL語句,像這樣

SELECT * 
FROM myTable 
WHERE Field1 LIKE '%a%' OR Field1 LIKE '%b%' 
    OR Field2 LIKE '%a%' OR Field2 LIKE '%b%' 

正如你可以看到,如果可是沒有任何的支架和有OR的而不是AND。

無論如何,我可以讓DbExtensions使用可用的方法來執行我想要的操作,而無需將其全部寫入另一個StringBuilder中?

編輯 我已經改變了我的代碼,建議本

var builder = SQL 
    .SELECT("*") 
    .FROM("myTable") 
    .WHERE(); 

foreach (var field in fields) { 
    builder._OR(field.values, field.columnName + " LIKE {0}", v => new object[1] { "%" + v.ToString() + "%" }); 
} 

,但我也需要附加的或進入當前塊。因此,可以說每個字段都有一個名爲「CheckBlank」的屬性,如果爲true,我需要添加「OR FieldX IS NULL」,這怎麼辦?所以我會想到落得這樣的SQL如果Field1.CheckBlank是真實的,但字段2 CheckBlank是假

SELECT * 
FROM myTable 
WHERE (Field1 LIKE '%a%' OR Field1 LIKE '%b%' OR Field1 IS NULL) 
    AND (Field2 LIKE '%a%' OR Field2 LIKE '%b%') 
+0

你能提供DbExtension庫的鏈接嗎? –

+0

https://github.com/maxtoroq/DbExtensions – Gillardo

回答

0

您可以使用此示例來生成指定的查詢。

查詢:

SELECT * 
FROM myTable 
WHERE (Field1 LIKE '%a%' OR Field1 LIKE '%b%') 
    AND (Field2 LIKE '%a%' OR Field2 LIKE '%b%') 

代碼片段做到這一點:

var builder = SQL 
    .SELECT("*") 
    .FROM("myTable") 
    .WHERE(); 

foreach (var field in fields) { 
     builder.WHERE("").Append("(") 
     var index = 0; 
     foreach (var value in field.values) { 
      builder.AppendClause("WHERE", index == 0 ? "": " OR ", field.columnName + " LIKE {0}", new object[] { "%" + value.Value + "%" }); 
     } 
     index++; 
     builder.Append(")"); 
    } 
0

試試這個:

var builder = SQL 
    .SELECT("*") 
    .FROM("myTable") 
    .WHERE(); 

foreach (var field in fields) { 
    builder._OR(field.values, field.columnName + " LIKE {0}", v => new object[1] { "%" + v.ToString() + "%" }); 
} 

我不知道,如果與參數值合併%是最好的選擇。我主要使用MySQL,我在那裏做Field1 LIKE CONCAT('%', {0}, '%')。不要將參數值附加到格式字符串,它可能會暴露注入。

+0

最大值如何追加查詢到OR?編輯更詳細的問題。偉大的圖書館btw! – Gillardo