Bir SQL WHERE yan tümcesini dinamik olarak oluşturmanın başlangıcında 1 = 1 kullanmaktan daha iyi bir yolu var mı?


110

C # ile bazı SQL sorguları oluşturuyorum. Kodda değişkenler olarak saklanan bazı koşullara bağlı olarak farklılık gösterecektir.

string Query="SELECT * FROM Table1 WHERE 1=1 ";
if (condition1) 
    Query += "AND Col1=0 ";
if (condition2) 
    Query += "AND Col2=1 ";
if (condition3) 
    Query += "AND Col3=2 ";

İşe yarıyor, ancak 1 = 1'i test etmek zarif görünmüyor. Kullanmasaydım, sorguya "nerede" anahtar kelimesinin önceden eklenip eklenmediğini her seferinde hatırlamam ve kontrol etmem gerekirdi.

Daha güzel bir çözüm var mı?


118
Dürüst olmak gerekirse - ben de böyle yapardım, ama kullanırım 42 = 42;-)
fero

5
Aslında sorgularımı hep böyle yazıyorum. Bir koşulu yorumlamayı kolaylaştırır
Deruijter

4
@catfood Stajyer olarak yaptığım ilk proje, Sybase sunucularımıza karşı performans sorgularını analiz etmeye yardımcı olacak araçlar yazmaktı. Select 42Aldığımız yüz binlerce sorgu eğlenceli bir keşifti . (eğlenceli olmayan kaynağı bulmaya çalışmaktı)
Bay Mindor

24
If I didn't use it, I would have to remember and check every time if "where" keyword was already added or not to the query- Bu yüzden kullanıyorsun 1 = 1. Veritabanı motoru onu yine de optimize eder, bu yüzden çirkin görünse de, sorunu çözmenin en kolay yolu budur.
Robert Harvey

4
Verilen cevaplar çok güzel olsa da orijinal kodunuzun okunması en kolay olanı olduğunu düşünüyorum.
Uooo

Yanıtlar:


157

Koşulları bir listeye kaydedin:

List<string> conditions = new List<string>();

if (condition1) conditions.Add("Col1=0");
//...
if (conditions.Any())
    Query += " WHERE " + string.Join(" AND ", conditions.ToArray());

24
İyi bir çözüm, ancak ToArray()herhangi birini kabul eden bir aşırı yükleme olduğu için .NET 4 ile gerekli değildir IEnumerable<string>.
fero

101
Bunun sağladığı tüm SQL enjeksiyon fırsatları için heyecanlıyım.
asteri

12
@Jeff Eğer where cümlesindeki değerleri sabit kodlamıyorsanız, SqlParameters ile de 2. bir listeye sahip olabilirsiniz. Bu listeyi koşullar listesiyle aynı anda doldurmanız ve sonunda AddRange (parameters.ToArray ()) öğesini çağırmanız gerekir .
Scott Chamberlain

5
@ScottChamberlain Evet, listeye koymadan önce giriş dizelerinden de çıkabilirsiniz. Çoğunlukla olası bir saldırıya karşı şakacı mizah kullanarak uyarıyordum.
asteri

4
@Jeff, yalnızca koşullar kullanıcı girişi içeriyorsa (orijinal örnek içermez) SQL enjeksiyonuna karşı savunmasızdır
D Stanley

85

Çözümlerden biri, dizeleri ekleyerek sorguları manuel olarak yazmamaktır. Entity Framework gibi bir ORM kullanabilir ve LINQ to Entities ile dil ve çerçevenin size sunduğu özellikleri kullanabilirsiniz:

using (var dbContext = new MyDbContext())
{
    IQueryable<Table1Item> query = dbContext.Table1;

    if (condition1)
    {
        query = query.Where(c => c.Col1 == 0);
    }
    if (condition2)
    {
        query = query.Where(c => c.Col2 == 1);
    }
    if (condition3)
    {
        query = query.Where(c => c.Col3 == 2);
    }   

    PrintResults(query);
}

@vaheeds Bu soruyu anlamıyorum. Her ikisi de farklı ORM'lerdir.
CodeCaster

Üzgünüm, zarif performansın diğer ORM'lerle karşılaştırılması için arama yapıyordum ve buraya google'dan geliyorum, bu yüzden oluşturulan PrintResults(query)sorgunun daha sonra dapper'da sorgu olarak kullanılacağını düşündüm !!
vaheeds

@vaheeds tamam, ancak bir cevabı anlamamak, olumsuz oy vermeyi gerektirmez. Eğer bu siz olsaydınız, bu tesadüfen yorumunuzla aynı zamanda oldu.
CodeCaster

hakkınız, bu bir yanlış anlamaydı. Linq to varlıklara karmaşık sorgularda kötü performans sorunu yaşıyorum.
Olumsuz

Bu sorunun cevabı değil
HGMamaci

17

Bu basit durumda biraz abartılı ama geçmişte buna benzer bir kod kullandım.

Bir işlev oluşturun

string AddCondition(string clause, string appender, string condition)
{
    if (clause.Length <= 0)
    {
        return String.Format("WHERE {0}",condition);
    }
    return string.Format("{0} {1} {2}", clause, appender, condition);
}

Bunu böyle kullan

string query = "SELECT * FROM Table1 {0}";
string whereClause = string.Empty;

if (condition 1)
    whereClause = AddCondition(whereClause, "AND", "Col=1");

if (condition 2)
    whereClause = AddCondition(whereClause, "AND", "Col2=2");

string finalQuery = String.Format(query, whereClause);

Bu şekilde, hiçbir koşul bulunmazsa, sorguya bir where ifadesini yüklemekten bile rahatsız olmazsınız ve sql sunucusuna, sql ifadesini ayrıştırırken önemsiz where cümlesini işlemenin bir mikro saniyesini kaydedin.


Bunun onu nasıl daha zarif hale getirdiğini anlamıyorum. Burada ne olduğu kesinlikle daha net değil. Bu yardımcı program işlevinin kullanımını görebiliyorum, ancak daha zarif değil.
usr

mikro saniyenin önemi hakkında bizi aydınlatmanız için size bir oy verdi
user1451111

15

Şık olmayan, ancak sorunu çözen ve işe yarayan başka bir çözüm var:

String query = "SELECT * FROM Table1";
List<string> conditions = new List<string>();
// ... fill the conditions
string joiner = " WHERE ";
foreach (string condition in conditions) {
  query += joiner + condition;
  joiner = " AND "
}

İçin:

  • boş koşullar listesi, sonuç basitçe olacaktır SELECT * FROM Table1,
  • tek bir koşul olacak SELECT * FROM Table1 WHERE cond1
  • takip eden her koşul ek AND condN

6
Bu, WHEREeğer yüklemler yoksa bir sarkıklık bırakır ; 1 = 1 özellikle bundan kaçınmak için var.
Gaius

Öyleyse geçiş yap String query = "SELECT * FROM Table1";ve string jointer = " WHERE ";?
Brendan Long

Daha sonra @BrendanLong WHEREedilir ANDkoşullarına arasına yerleştirilecek?
PenguinCoder

@PenguinCoder Bir yorumda kodun tamamını göstermek zor. string joinerSatırı değiştirmeyi string joiner = " WHERE ";ve joiner = " AND ";satırı rahat bırakmayı kastettim .
Brendan Long

@Gaius Koşulların boş olmadığını varsaydım, ancak WHERE'ı marangoz'a koymak hile yapmalı. Yorum için teşekkürler!
Dariusz

11

Bunun gibi bir şey yap:

using (var command = connection.CreateCommand())
{
    command.CommandText = "SELECT * FROM Table1";

    var conditions = "";
    if (condition1)
    {    
        conditions += "Col1=@val1 AND ";
        command.AddParameter("val1", 1);
    }
    if (condition2)
    {    
        conditions += "Col2=@val2 AND ";
        command.AddParameter("val2", 1);
    }
    if (condition3)
    {    
        conditions += "Col3=@val3 AND ";
        command.AddParameter("val3", 1);
    }
    if (conditions != "")
        command.CommandText += " WHERE " + conditions.Remove(conditions.Length - 5);
}

It adlı SQL enjeksiyon güvenli ve IMHO , oldukça temiz. Remove()Basitçe son kaldırır AND;

Hem herhangi bir koşul ayarlanmadıysa, hem de biri ayarlandıysa veya birden çok ayarlandıysa çalışır.


1
Emin (C # kendim kullanmayın) değilim ama bunu söyleyebilirim conditions != nullher zaman truesize kullanıma hazır hale getirmeniz olarak, ""(C # sürece "" == null). conditionsBoş değilse muhtemelen bir çek olmalı … ;-)
siegi

9

Sadece arkaya iki satır ekleyin.

string Query="SELECT * FROM Table1 WHERE 1=1 ";
if (condition1) Query+="AND Col1=0 ";
if (condition2) Query+="AND Col2=1 ";
if (condition3) Query+="AND Col3=2 ";
Query.Replace("1=1 AND ", "");
Query.Replace(" WHERE 1=1 ", "");

Örneğin

SELECT * FROM Table1 WHERE 1=1 AND Col1=0 AND Col2=1 AND Col3=2 

olacak

SELECT * FROM Table1 WHERE Col1=0 AND Col2=1 AND Col3=2 

Süre

SELECT * FROM Table1 WHERE 1=1 

olacak

SELECT * FROM Table1

=====================================

Bu çözümün bir kusuruna işaret ettiğiniz için teşekkür ederiz:

"Herhangi bir nedenle koşullardan biri" 1 = 1 AND "veya" WHERE 1 = 1 "metnini içeriyorsa, bu durum sorguyu bozabilir. Koşul bir alt sorgu içeriyorsa veya bazı sütunu bu metni içerir, örneğin. Sizin durumunuzda bu bir sorun olmayabilir, ancak bunu aklınızda bulundurmalısınız… "

Bu sorundan kurtulmak için, "ana" NEREDE 1 = 1 ile bunları alt sorgudan ayırmamız gerekiyor, bu kolay:

"Main" i özel bir YERDE yapın : "$" işareti eklerdim

string Query="SELECT * FROM Table1 WHERE$ 1=1 ";
if (condition1) Query+="AND Col1=0 ";
if (condition2) Query+="AND Col2=1 ";
if (condition3) Query+="AND Col3=2 ";

Sonra yine de iki satır ekleyin:

Query.Replace("WHERE$ 1=1 AND ", "WHERE ");
Query.Replace(" WHERE$ 1=1 ", "");

1
Herhangi bir nedenle koşullardan biri "1=1 AND "veya metnini içeriyorsa bu, sorguyu bozabilir " WHERE 1=1 ". Örneğin, koşul bir alt sorgu içeriyorsa veya bazı sütunun bu metni içerip içermediğini kontrol etmeye çalışıyorsa bu durum söz konusu olabilir. Belki bu sizin durumunuzda bir sorun değildir, ancak bunu aklınızda tutmalısınız…
siegi

8

Bunu kullan:

string Query="SELECT * FROM Table1 WHERE ";
string QuerySub;
if (condition1) QuerySub+="AND Col1=0 ";
if (condition2) QuerySub+="AND Col2=1 ";
if (condition3) QuerySub+="AND Col3=2 ";

if (QuerySub.StartsWith("AND"))
    QuerySub = QuerySub.TrimStart("AND".ToCharArray());

Query = Query + QuerySub;

if (Query.EndsWith("WHERE "))
    Query = Query.TrimEnd("WHERE ".ToCharArray());

Bu cevap işe yarayacak ve bunda gerçekten yanlış bir şey yok, ancak orijinal sorudan daha temiz ve basit olduğunu düşünmüyorum . Dize arama QuerySub, bence where 1=1hack kullanmaktan daha iyi ya da daha kötü değil . Ancak düşünceli bir katkıdır.
kedi maması

3
Bir hata oluştu. Düzeltildi. Koşullardan hiçbiri mevcut olmasaydı sorgum bombalanırdı: -P Yine de Ahmed'in veya CodeCaster'ın benim için en iyi çözüm olduğunu söylemeliyim. Size sadece bir alternatif sundum çocuklar!
Anshuman

Bu genel olarak hala yanlıştır. Varsayalım ki ... FROM SOMETABLE WHERE ; o TrimEndzaman aslında bunu düşürür ... FROM SOMETABL. Eğer bu aslında bir ise StringBuilder(ki bu kadar çok dize manipülasyonuna veya daha fazlasına sahipseniz olması gerekir), sadece yapabilirsiniz Query.Length -= "WHERE ".Length;.
Mark Hurd

Mark, işe yarıyor. Bunu birçok projede denedim. Deneyin ve öyle olduğunu göreceksiniz!
Anshuman

8
cehennem kadar çirkin :) artı doğru
sayarsam

5

Neden mevcut bir Sorgu Oluşturucu kullanmıyorsunuz? Sql Kata gibi bir şey .

Koşulların, birleşimlerin ve alt sorgularda karmaşıklığı destekler.

var query = new Query("Users").Where("Score", ">", 100).OrderByDesc("Score").Limit(100);

if(onlyActive)
{
   query.Where("Status", "active")
}

// or you can use the when statement

query.When(onlyActive, q => q.Where("Status", "active"))

Sql Server, MySql ve PostgreSql ile çalışır.


4

Aklıma gelen sorduğunuz şeye en hızlı gerçek çözüm şudur:

string Query="SELECT * FROM Table1";
string Conditions = "";

if (condition1) Conditions+="AND Col1=0 ";
if (condition2) Conditions+="AND Col2=1 ";
if (condition3) Conditions+="AND Col3=2 ";

if (Conditions.Length > 0) 
  Query+=" WHERE " + Conditions.Substring(3);

Sizi CodeCaster'ın bir ORM kullanma tavsiyesine yönlendireceğim elbette zarif görünmüyor. Ancak bunun burada ne yaptığını düşünürseniz, gerçekten 4 karakter hafızayı 'boşa harcamak' konusunda endişelenmiyorsunuz ve bir bilgisayarın bir işaretçiyi 4 yere hareket ettirmesi gerçekten çok hızlı.

Bir ORM'yi nasıl kullanacağınızı öğrenmek için zamanınız varsa, bu sizin için gerçekten faydalı olabilir. Ancak bununla ilgili olarak, bu ek koşulun SQL veritabanına çarpmasını önlemeye çalışıyorsanız, bu sizin için yapacaktır.


4

Bu SQL Server ise bu kodu çok daha temiz hale getirebilirsiniz.

Bu aynı zamanda, olasılıkları düşündüğümde kötü bir varsayım olabilecek bilinen bir dizi parametre varsayar.

C # 'da şunları kullanırsınız:

using (SqlConnection conn = new SqlConnection("connection string"))
{
    conn.Open();
    SqlCommand command = new SqlCommand()
    {
        CommandText = "dbo.sample_proc",
        Connection = conn,
        CommandType = CommandType.StoredProcedure
    };

    if (condition1)
        command.Parameters.Add(new SqlParameter("Condition1", condition1Value));
    if (condition2)
        command.Parameters.Add(new SqlParameter("Condition2", condition2Value));
    if (condition3)
        command.Parameters.Add(new SqlParameter("Condition3", condition3Value));

    IDataReader reader = command.ExecuteReader();

    while(reader.Read())
    {
    }

    conn.Close();
}

Ve sonra SQL tarafında:

CREATE PROCEDURE dbo.sample_proc
(
    --using varchar(50) generically
    -- "= NULL" makes them all optional parameters
    @Condition1 varchar(50) = NULL
    @Condition2 varchar(50) = NULL
    @Condition3 varchar(50) = NULL
)
AS
BEGIN
    /*
    check that the value of the parameter 
    matches the related column or that the 
    parameter value was not specified.  This
    works as long as you are not querying for 
    a specific column to be null.*/
    SELECT *
    FROM SampleTable
    WHERE (Col1 = @Condition1 OR @Condition1 IS NULL)
    AND   (Col2 = @Condition2 OR @Condition2 IS NULL)
    AND   (Col3 = @Condition3 OR @Condition3 IS NULL)
    OPTION (RECOMPILE)
    --OPTION(RECOMPILE) forces the query plan to remain effectively uncached
END

Sütunlarınızı bir ifadenin içinde gizlemek dizinlerin kullanılmasını engelleyebilir ve bu teknik burada bu nedenle önerilmez .
bbsimonbb

bu ilginç bir keşif. Bu bilgi için teşekkürler. güncellenecek
mckeejm

3

Koşula bağlı olarak, sorguda boole mantığı kullanmak mümkün olabilir. Bunun gibi bir şey:

string Query="SELECT * FROM Table1  " +
             "WHERE (condition1 = @test1 AND Col1=0) "+
             "AND (condition2 = @test2 AND Col2=1) "+
             "AND (condition3 = @test3 AND Col3=2) ";

3

Stringbuilder'ın akıcı arayüzünü beğendim, bu yüzden bazı ExtensionMethods yaptım.

var query = new StringBuilder()
    .AppendLine("SELECT * FROM products")
    .AppendWhereIf(!String.IsNullOrEmpty(name), "name LIKE @name")
    .AppendWhereIf(category.HasValue, "category = @category")
    .AppendWhere("Deleted = @deleted")
    .ToString();

var p_name = GetParameter("@name", name);
var p_category = GetParameter("@category", category);
var p_deleted = GetParameter("@deleted", false);
var result = ExecuteDataTable(query, p_name, p_category, p_deleted);


// in a seperate static class for extensionmethods
public StringBuilder AppendLineIf(this StringBuilder sb, bool condition, string value)
{
    if(condition)
        sb.AppendLine(value);
    return sb;
}

public StringBuilder AppendWhereIf(this StringBuilder sb, bool condition, string value)
{
    if (condition)
        sb.AppendLineIf(condition, sb.HasWhere() ? " AND " : " WHERE " + value);
    return sb;
}

public StringBuilder AppendWhere(this StringBuilder sb, string value)
{
    sb.AppendWhereIf(true, value);
    return sb;
}

public bool HasWhere(this StringBuilder sb)
{
    var seperator = new string [] { Environment.NewLine };
    var lines = sb.ToString().Split(seperator, StringSplitOptions.None);
    return lines.Count > 0 && lines[lines.Count - 1].Contains("where", StringComparison.InvariantCultureIgnoreCase);
}

// http://stackoverflow.com/a/4217362/98491
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
    return source.IndexOf(toCheck, comp) >= 0;
}

2

IMHO, yaklaşımınızın yanlış olduğunu düşünüyorum:

Veritabanını dizeyi birleştirerek sorgulamak ASLA iyi bir fikir değildir ( SQL enjeksiyonu riski ve başka bir yerde bazı değişiklikler yaparsanız kod kolayca kırılabilir).

Bir ORM ( NHibernate kullanıyorum ) kullanabilir veya en azından şunu kullanabilirsiniz:SqlCommand.Parameters

Kesinlikle dize birleştirme kullanmak istiyorsanız, bir kullanırım StringBuilder(bu, dize birleştirme için doğru nesnedir):

var query = new StringBuilder("SELECT * FROM Table1 WHERE");
int qLength = query.Length;//if you don't want to count :D
if (Condition1) query.Append(" Col1=0 AND");
if (Condition2) query.Append(" Col2=0 AND");
....
//if no condition remove WHERE or AND from query
query.Length -= query.Length == qLength ? 6 : 4;

Son düşünce Where 1=1gerçekten çirkin ama SQL Server onu yine de optimize edecek.


SELECT * FROM Table1 WHERE AND Col1=0doğru görünmüyor, bütün mesele bu WHERE 1=1.
Mormegil

2

Dapper SqlBuilder oldukça iyi bir seçenektir. StackOverflow'da üretimde bile kullanılıyor.

Sam'in bununla ilgili blog yazısını okuyun .

Bildiğim kadarıyla, herhangi bir Nuget paketinin parçası değil, bu yüzden kodunu projenize kopyalamanız veya Dapper kaynağını indirmeniz ve SqlBuilder projesini oluşturmanız gerekecek. Her iki durumda da, DynamicParameterssınıf için Dapper'a da başvurmanız gerekir .


1
Dapper's SqlBuilder'ın bu pakete dahil olduğunu sanmıyorum.
Ronnie Overby

1

Bunun, depolanan prosedürler içinde dinamik SQL oluştururken Oracle'da her zaman kullanıldığını görüyorum . Veri sorunlarını araştırırken ve aynı zamanda farklı veri filtreleri arasında geçişi hızlandırmak için sorgularda kullanıyorum ... Sadece bir koşulu yorumlayın veya kolayca tekrar ekleyin.

Kodunuzu gözden geçiren biri için oldukça yaygın ve anlaşılması kolay buluyorum.


1
public static class Ext
{
    public static string addCondition(this string str, bool condition, string statement)
    {
        if (!condition)
            return str;

        return str + (!str.Contains(" WHERE ") ? " WHERE " : " ") + statement;
    }

    public static string cleanCondition(this string str)
    {
        if (!str.Contains(" WHERE "))
            return str;

        return str.Replace(" WHERE AND ", " WHERE ").Replace(" WHERE OR ", " WHERE ");
    }
}

Uzatma yöntemleriyle gerçekleştirme.

    static void Main(string[] args)
    {
        string Query = "SELECT * FROM Table1";

        Query = Query.addCondition(true == false, "AND Column1 = 5")
            .addCondition(18 > 17, "AND Column2 = 7")
            .addCondition(42 == 1, "OR Column3 IN (5, 7, 9)")
            .addCondition(5 % 1 > 1 - 4, "AND Column4 = 67")
            .addCondition(Object.Equals(5, 5), "OR Column5 >= 0")
            .cleanCondition();

        Console.WriteLine(Query);
    }

TAHILA KARŞI GİDİYOR!
Ronnie Overby

Afedersiniz? Ne demek istiyorsun?
Maxim Zhukov

0

stringFonksiyonu kullanarak bunu şu şekilde de yapabilirsiniz:

string Query = "select * from Table1";

if (condition1) WhereClause += " Col1 = @param1 AND "; // <---- put conditional operator at the end
if (condition2) WhereClause += " Col1 = @param2 OR ";

WhereClause = WhereClause.Trim();

if (!string.IsNullOrEmpty(WhereClause))
    Query = Query + " WHERE " + WhereClause.Remove(WhereClause.LastIndexOf(" "));
// else
// no condition meets the criteria leave the QUERY without a WHERE clause  

Durumunu tahmin etmek kolay olduğu için, koşullu unsurları sonunda kaldırmak için kendimi kolay hissediyorum.


0

Belki biraz daha okunaklı bir çözüm düşündüm:

string query = String.Format("SELECT * FROM Table1 WHERE "
                             + "Col1 = {0} AND "
                             + "Col2 = {1} AND "
                             + "Col3 = {2}",
                            (!condition1 ? "Col1" : "0"),
                            (!condition2 ? "Col2" : "1"),
                            (!condition3 ? "Col3" : "2"));

SQL yorumlayıcısının da durumu optimize edip etmeyeceğinden emin değilim Col1 = Col1( condition1yanlış olduğunda yazdırılır ).


0

İşte daha zarif bir yol:

    private string BuildQuery()
    {
        string MethodResult = "";
        try
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("SELECT * FROM Table1");

            List<string> Clauses = new List<string>();

            Clauses.Add("Col1 = 0");
            Clauses.Add("Col2 = 1");
            Clauses.Add("Col3 = 2");

            bool FirstPass = true;

            if(Clauses != null && Clauses.Count > 0)
            {
                foreach(string Clause in Clauses)
                {
                    if (FirstPass)
                    {
                        sb.Append(" WHERE ");

                        FirstPass = false;

                    }
                    else
                    {
                        sb.Append(" AND ");

                    }

                    sb.Append(Clause);

                }

            }

            MethodResult = sb.ToString();

        }
        catch //(Exception ex)
        {
            //ex.HandleException()
        }
        return MethodResult;
    }

0

Belirtildiği gibi, birleştirme yoluyla SQL oluşturmak asla iyi bir fikir değildir . Sadece SQL enjeksiyonu yüzünden değil. Çoğunlukla çirkin, bakımı zor ve tamamen gereksiz olduğu için . Hangi SQL'i ürettiğini görmek için programınızı izleme veya hata ayıklama ile çalıştırmanız gerekir. Eğer kullanırsanız QueryFirst (yasal uyarı: Yazdığım) mutsuz günaha kaldırılır ve SQL'de bunu yapıyor ta düz giremez.

Bu sayfada , arama tahminlerini dinamik olarak eklemek için kapsamlı bir TSQL seçenekleri bulunmaktadır. Aşağıdaki seçenek, arama tahminleri kombinasyonlarının seçimini kullanıcınıza bırakmak istediğiniz durumlarda kullanışlıdır.

select * from table1
where (col1 = @param1 or @param1 is null)
and (col2 = @param2 or @param2 is null)
and (col3 = @param3 or @param3 is null)
OPTION (RECOMPILE)

QueryFirst size C # null - db NULL verir, bu yüzden sadece Execute () yöntemini uygun olduğunda null değerlerle çağırırsınız ve hepsi çalışır. <opinion> C # geliştiricileri, daha basit olsa bile SQL'de bir şeyler yapmaya neden bu kadar isteksizler? Akıl almaz. </opinion>


0

Daha uzun filtreleme adımları için StringBuilder birçok kişinin söylediği gibi daha iyi bir yaklaşımdır.

senin durumunda ben:

StringBuilder sql = new StringBuilder();

if (condition1) 
    sql.Append("AND Col1=0 ");
if (condition2) 
    sql.Append("AND Col2=1 ");
if (condition3) 
    sql.Append("AND Col3=2 ");

string Query = "SELECT * FROM Table1 ";
if(sql.Length > 0)
 Query += string.Concat("WHERE ", sql.ToString().Substring(4)); //avoid first 4 chars, which is the 1st "AND "

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.