我有一个名为Tags(Id,Name)的数据库表,我想从中选择名称与列表中的名称匹配的表。在SQL中我会使用类似的东西:
Select * from Tags Where Name In ('Name1', 'Name2', 'xxx...)
但是现在在ASP.Net MVC3项目中使用PetaPoco我很难搞清楚如何正确地完成它。到目前为止,我已经尝试过:
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);
这导致以下SQL,其中我的tagsToFind列表中只有第一个名称用于匹配表数据而不是所有表。
SELECT * FROM Tags WHERE (Name in (@0)) -> @0 [String] = "SqlServer"
这有点令人沮丧,知道这可能不是那么难......任何帮助都表示赞赏!
更新 我发现它可以用另一种方式完成
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)
使用sqlparameters时我得到了我想要的东西。所以我觉得它现在已经足够好了,虽然不是很漂亮。
/麦克
答案 0 :(得分:55)
除非您不能使用@ 0(序数)语法,否则这将有效。您必须使用命名参数,否则它认为它们是单独的参数。
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);
这将导致
select * from Tags where name in (@0, @1);
@0 = SqlServer, @1 = IIS
答案 1 :(得分:12)
将来发布给未来的求职者。这很有效。
public IEnumerable<Invoice> GetInvoicesByStatus(List<string> statuses)
{
return _database.Fetch<Invoice>(@"
select *
from Invoices
where Status IN (@statuses)",
new { statuses });
}
答案 2 :(得分:4)
如果你想使用Petapoco的数组类,你可以使用这个
string[] array = new string[] {"Name1","Name2" };
var foo = BasicRepository<Personnel>.Fetch("WHERE PersonnelId IN (@0)", array.ToArray());
答案 3 :(得分:0)
这是另一个样本:
<强>的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使用localdb connectionstring,因此您可以更改它。)
<?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>
答案 4 :(得分:0)
也许,在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());
在字符串中构造stander SQL,并检查最后的excute-sql,总是符合你的需要。
var userIDs = from user in UserList select user.UserID;
db.Delete<User>("where UserID in (" + string.Join(",", userIDs) + ")");