如何在PetaPoco中使用SQL WHERE IN构造?

Mit*_*h99 32 orm petapoco npoco

我有一个名为Tags(Id,Name)的数据库表,我想从中选择名称与列表中的名称匹配的表.在SQL中我会使用类似的东西:

Select * from Tags Where Name In ('Name1', 'Name2', 'xxx...)
Run Code Online (Sandbox Code Playgroud)

但是现在在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);
Run Code Online (Sandbox Code Playgroud)

这导致以下SQL,其中使用tagsToFind列表中的第一个名称来匹配表数据而不是所有表名数据.

SELECT * FROM Tags WHERE (Name in (@0)) -> @0 [String] = "SqlServer"
Run Code Online (Sandbox Code Playgroud)

这有点令人沮丧,知道这可能不是那么难......任何帮助都表示赞赏!

更新: 我发现它可以用另一种方式完成

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)
Run Code Online (Sandbox Code Playgroud)

在使用sqlparameters时,它能让我得到我想要的东西.所以我觉得它现在已经足够好了,虽然不是很漂亮.

/麦克风

Sch*_*ime 57

这将起作用,除非您不能使用@ 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);
Run Code Online (Sandbox Code Playgroud)

这将导致

select * from Tags where name in (@0, @1);
@0 = SqlServer, @1 = IIS
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,这有助于我在PetaPoco中使用多个参数,谢谢! (3认同)

Inv*_*Dog 14

将此发布给未来的寻求者.这有效.

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


小智 6

如果要在Petapoco中使用数组类,可以使用此方法

string[] array = new string[] {"Name1","Name2" };

var foo = BasicRepository<Personnel>.Fetch("WHERE PersonnelId IN (@0)", array.ToArray());
Run Code Online (Sandbox Code Playgroud)