C'è una lezione integrata nel quadro .NET che può essere utilizzato per denotare un ansistring?

StackOverflow https://stackoverflow.com/questions/6069021

  •  07-09-2020
  •  | 
  •  

Domanda

per DAPPER Ho bisogno di creare il supporto per il passaggio dei parametri di ansisistring.

Database dispone di stringhe sia unicode che non unicode, scegliere il tipo di parametro giusto è a volte cruciale.

DbType.String VS DbType.AnsiString per un particolare parametro può aumentare pesantemente perf.

In Dappero passiamo in parametri dinamicamente, ad esempio:

Query<User>("select * from Users where Name=@Name", new {Name = "name"});
.

Ho una mappa interna che dice che se vedo typeof(String) lo so per passare nel parametro come DbType.String

Tuttavia, vorrei che i miei utenti siano in grado di indicare che la stringa dovrebbe essere un ansistrante. Gli attributi non sono supportati per le classi anonime, quindi ho bisogno di un tipo distinto per questo.

chiaramente posso inventare uno:

public class AnsiString 
{
    private readonly string str;
    public AnsiString(string str)
    {
        this.str = str;
    }

    public String Value { get { return str; } }
}
.

che mi darebbe l'API pulita:

Query<User>("select * from Users where Name=@Name", 
   new {Name = new AnsiString("name")});
.

Tuttavia, perché inventare uno se tale classe esiste in System.Data o BCL.

C'è un tipo da qualche parte nel BCL o nel System.Data che potrei utilizzare come contenitore per AnsiString, con semantica simile al campione sopra?

È stato utile?

Soluzione

Non c'è una classe di questo tipo in BCL o System.Data, dovrai lanciare il tuo.

Siamo andati con un tipo personalizzato per fornire una dogania più a grana fine alla fine;Questo test mostra l'utilizzo tipico:

public void TestDbString()
{
    var obj = connection.Query("select datalength(@a) as a, datalength(@b) as b, datalength(@c) as c, datalength(@d) as d, datalength(@e) as e, datalength(@f) as f",
        new
        {
            a = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true },
            b = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = false },
            c = new DbString { Value = "abcde", IsFixedLength = false, Length = 10, IsAnsi = true },
            d = new DbString { Value = "abcde", IsFixedLength = false, Length = 10, IsAnsi = false },
            e = new DbString { Value = "abcde", IsAnsi = true },
            f = new DbString { Value = "abcde", IsAnsi = false },
        }).First();
    ((int)obj.a).IsEqualTo(10);
    ((int)obj.b).IsEqualTo(20);
    ((int)obj.c).IsEqualTo(5);
    ((int)obj.d).IsEqualTo(10);
    ((int)obj.e).IsEqualTo(5);
    ((int)obj.f).IsEqualTo(10);
}
.

così;Supporta:

    .
  • ansi vs unicode
  • Fixato VS Dynamic Lunghezza
  • Nel caso della lunghezza dinamica, esplorare VS implicita (4000 se la lunghezza è <= 4000; "max" altrimenti - questo mantiene il numero di piani di query sane)

Il tipo è disponibile all'interno di dapper .

Altri suggerimenti

Immagino sia possibile utilizzare string per DbType.String e char[] per DbType.AnsiString.

Sembrerà molto simile al tuo codice corrente:

Query<User>("select * from Users where Name=@Name", new {Name = "name".ToCharArray()});
.

o se si utilizza il tuo ansistring, è possibile creare il metodo di estensione .ToAnsiString():

public static AnsiString( this string s ) { return new AnsiString(s); }
Query<User>("select * from Users where Name=@Name", new {Name = "name".ToAnsiString()});
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top