2011-08-04 72 views
29

我有一個名爲Tags(Id,Name)的數據庫表,我想從中選擇名稱與列表中的名稱相匹配的名稱。在SQL我會使用類似:如何在PetaPoco中使用SQL WHERE IN構造?

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想要的東西來完成。所以我想現在已經足夠好了,雖然不是非常漂亮。

/麥克

回答

54

這將只是你的工作不能使用@ 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 
+3

很好,這幫助我與PetaPoco一起使用多個參數,謝謝! – Mitch99

+1

當我嘗試使用整數數組時,它只是將該子句留作「字段in(@ 0)」 而是,我執行了一個string.Join(「,」,integerArray)作爲參數。無論如何,這似乎更有效,因爲PetaPoco ParametersHelper類迭代了可枚舉元素。 –

+0

神聖煙!這是一些外部思考的問題 – Gaspa79

12

張貼這爲今後的求職者。這工作。

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

如果你想使用數組類Petapoco您可以使用此

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

var foo = BasicRepository<Personnel>.Fetch("WHERE PersonnelId IN (@0)", array.ToArray()); 
+0

那個''.ToArray()''解決了我遇到的問題。 ''itemLists = rep.Find(「WHERE ItemId IN(@ 0)」,items.ToArray())。ToList()''謝謝。 – iiminov

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

構建字符串機架SQL,並檢查上次EXCUTE-SQL,送花兒給人符合您的需求。

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