J'ai une table de base de données nommée Tags (Id, Nom) à partir de laquelle j'aimerais sélectionner celles dont le nom correspond à un nom dans une liste. En SQL, je voudrais utiliser quelque chose comme:
Select * from Tags Where Name In ('Name1', 'Name2', 'xxx...)
Mais maintenant, en utilisant PetaPoco dans un projet ASP.Net MVC3, je ne sais plus trop comment le faire correctement. Jusqu'ici j'ai essayé:
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);
Il en résulte le code SQL suivant, où seul le premier nom dans ma liste de balisesToFind est utilisé pour faire correspondre les données de la table, par opposition à toutes.
SELECT * FROM Tags WHERE (Name in (@0)) -> @0 [String] = "SqlServer"
C'est un peu frustrant de savoir que ce n'est probablement pas si difficile… toute aide est la bienvenue!
Mise à jour: J'ai découvert que cela pouvait être fait d'une autre manière
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)
ce qui me donne ce que je veux en utilisant sqlparameters. Donc je suppose que c'est assez bon pour le moment, bien que ce ne soit pas super joli.
/Mike
Cela fonctionnera sauf que vous ne pouvez pas utiliser la syntaxe @ 0 (ordinale). Vous devez utiliser des paramètres nommés, sinon il pense que ce sont des paramètres individuels.
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);
Cela se traduira par
select * from Tags where name in (@0, @1);
@0 = SqlServer, @1 = IIS
Poster ceci pour les futurs demandeurs. Cela marche.
public IEnumerable<Invoice> GetInvoicesByStatus(List<string> statuses)
{
return _database.Fetch<Invoice>(@"
select *
from Invoices
where Status IN (@statuses)",
new { statuses });
}
Si vous voulez utiliser la classe de tableau avec Petapoco, vous pouvez utiliser cette
string[] array = new string[] {"Name1","Name2" };
var foo = BasicRepository<Personnel>.Fetch("WHERE PersonnelId IN (@0)", array.ToArray());
Peut-être que ce n'est pas une bonne façon de configurer trop de paramètres en sql, la limite maximale de paramètres est de 2100 .
@Murat
string[] array = new string[] {"Name1","Name2" };
var foo = BasicRepository<Personnel>.Fetch("WHERE PersonnelId IN > (@0)", array.ToArray());
Construire SQL stander en chaîne et cochez la dernière case excute-sql, répondez toujours à vos besoins.
var userIDs = from user in UserList select user.UserID;
db.Delete<User>("where UserID in (" + string.Join(",", userIDs) + ")");
Voici un autre exemple:
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 utilise localdb connectionstring, vous pouvez donc le changer.)
<?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>