orm petapoco npoco

orm - ¿Cómo uso la construcción de WHERE IN de SQL con PetaPoco?



npoco (5)

Aquí hay otra muestra:

program.cs:

public static void Main(string[] args) { using (var db = new PetaPoco.Database("Northwind")) { var sql = "Select * from customers where Country in (@Countries)"; var countries = new { @Countries = new string[] { "USA", "Mexico" } }; var customers = db.Query<Customer>(sql, countries); foreach (var customer in customers) { Console.WriteLine("{0} - {1} from {2}", customer.CustomerID, customer.CompanyName, customer.Country); } } }

customer.cs:

public class Customer { public string CustomerID { get; set; } public string Address { get; set; } public string City { get; set; } public string CompanyName { get; set; } public string ContactName { get; set; } public string ContactTitle { get; set; } public string Country { get; set; } public string Fax { get; set; } public string Phone { get; set; } public string PostalCode { get; set; } public string Region { get; set; } }

App.config: (Connectionstring usa localdb connectionstring, por lo que podría cambiarlo).

<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <connectionStrings> <clear/> <add name="Northwind" connectionString="Data Source=(localdb)/v11.0;Initial Catalog=northwind;Integrated Security=True;" providerName="System.Data.SqlClient"/> </connectionStrings> </configuration>

Tengo una tabla de base de datos llamada Etiquetas (Id, Nombre) desde la cual me gustaría seleccionar aquellas en las que el nombre coincide con un nombre en una lista. En SQL usaría algo como:

Select * from Tags Where Name In (''Name1'', ''Name2'', ''xxx...)

Pero ahora, utilizando PetaPoco en un proyecto de MVC3 de ASP.Net, estoy atascado en descubrir cómo hacerlo correctamente. Hasta ahora he intentado:

var tagsToFind = new string[] { "SqlServer", "IIS" }; var sql = PetaPoco.Sql.Builder.Select("*").From("Tags").Where("Name in (@0)", tagsToFind); var result = db.Query<Tag>(sql);

Lo que resulta en el siguiente SQL, donde solo se usa el primer nombre en mi lista de tagsToFind para que coincida con los datos de la tabla en lugar de todos.

SELECT * FROM Tags WHERE (Name in (@0)) -> @0 [String] = "SqlServer"

Es un poco frustrante, sabiendo que esto probablemente no sea tan difícil ... ¡se agradece cualquier ayuda!

Actualización: descubrí que se puede hacer de otra manera

var sql = PetaPoco.Sql.Builder.Append("Select * from tags Where Name IN (@0", tagNames[0]); foreach (string tagName in tagNames.Where(x => x != tagNames[0])) { sql.Append(", @0", tagName); } sql.Append(")"); var result = db.Query<Tag>(sql)

que me da lo que quiero mientras uso sqlparameters. Así que supongo que es lo suficientemente bueno por ahora, aunque no es súper bonito.

/Micro


Esto funcionará, excepto que no puede usar la sintaxis @ 0 (ordinal). Debe usar parámetros con nombre; de ​​lo contrario, cree que son parámetros individuales.

var tagsToFind = new string[] { "SqlServer", "IIS" }; var sql = PetaPoco.Sql.Builder.Select("*").From("Tags").Where("Name in (@tags)", new { tags = tagsToFind }); var result = db.Query<Tag>(sql);

Esto resultará en

select * from Tags where name in (@0, @1); @0 = SqlServer, @1 = IIS


Publicar esto para los futuros buscadores. Esto funciona.

public IEnumerable<Invoice> GetInvoicesByStatus(List<string> statuses) { return _database.Fetch<Invoice>(@" select * from Invoices where Status IN (@statuses)", new { statuses }); }


Si quieres usar una clase de arreglo con Petapoco, puedes usar esto

string[] array = new string[] {"Name1","Name2" }; var foo = BasicRepository<Personnel>.Fetch("WHERE PersonnelId IN (@0)", array.ToArray());


Tal vez, no es una buena manera de configurar demasiados parámetros en sql, el límite máximo de parámetros es 2100 .

@Murat

string[] array = new string[] {"Name1","Name2" }; var foo = BasicRepository<Personnel>.Fetch("WHERE PersonnelId IN > (@0)", array.ToArray());

Construyendo stander SQL en cadena, y verifique el ÚLTIMO excutado-sql, siempre que coincida con su necesidad.

var userIDs = from user in UserList select user.UserID; db.Delete<User>("where UserID in (" + string.Join(",", userIDs) + ")");