How do I use the SQL WHERE IN construct with PetaPoco?

前端 未结 5 1117
鱼传尺愫
鱼传尺愫 2020-12-24 13:20

I have a database table named Tags (Id, Name) from which I would like to select the ones where the name matches a name in a list. In SQL I would use something like:

相关标签:
5条回答
  • 2020-12-24 13:33

    This will work except you can't use the @0 (ordinal) syntax. You must use named parameters, otherwise it thinks they are individual parameters.

    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);
    

    This will result in

    select * from Tags where name in (@0, @1);
    @0 = SqlServer, @1 = IIS
    
    0 讨论(0)
  • 2020-12-24 13:35

    Maybe, it's not a good way setting too many params in sql, the max params limit is 2100.

    @Murat

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

    Constructing stander SQL in string, and check the LAST excute-sql, alway match your need.

    var userIDs = from user in UserList select user.UserID;
    db.Delete<User>("where UserID in (" + string.Join(",", userIDs) + ")");
    
    0 讨论(0)
  • 2020-12-24 13:40

    Here is an another sample:

    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 uses localdb connectionstring, so you might change it.)

    <?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>
    
    0 讨论(0)
  • 2020-12-24 13:44

    If you want to use array class with Petapoco you can use this

    string[] array = new string[] {"Name1","Name2" };
    
    var foo = BasicRepository<Personnel>.Fetch("WHERE PersonnelId IN (@0)", array.ToArray());
    
    0 讨论(0)
  • 2020-12-24 13:48

    Posting this for future seekers. This works.

        public IEnumerable<Invoice> GetInvoicesByStatus(List<string> statuses)
        {
            return _database.Fetch<Invoice>(@"
                select *
                from Invoices                   
                where Status IN (@statuses)",
                new { statuses });
        }
    
    0 讨论(0)
提交回复
热议问题