2011-06-02 52 views
1

我需要限制从数据库中返回的客户博的数量,因为我正在寻找部分客户名称,并且此刻在搜索时获得600多个博客为一个'。我想此刻的限制这20我的代码是在Habanero我将如何限制从数据库返回的对象的数量

public IEnumerable<Customer> FindCustomers(string partialCustomerName) 
    { 
     if (string.IsNullOrEmpty(partialCustomerName)) 
      throw new ArgumentException("partialCustomerName must be at least one character long"); 
     var criteria = Criteria.Create<Customer, string>(cust => cust.CustomerName, Criteria.ComparisonOp.Like, partialCustomerName + "%"); 
     return Broker.GetBusinessObjectCollection<Customer>(criteria); 
    } 

回答

1

直到在那里,但没有给出正确的语法。 代理用于从当前数据访问器加载集合,而不是用于创建新集合。所以代码将是:

public IEnumerable<Customer> FindCustomers(string partialCustomerName) 
{ 
    if (string.IsNullOrEmpty(partialCustomerName)) 
     throw new ArgumentException("partialCustomerName must be at least one character long"); 

    var criteria = Criteria.Create<Customer, string>(cust => cust.CustomerName, Criteria.ComparisonOp.Like, partialCustomerName + "%"); 
    int totalRecords; 
    var col = new BusinessObjectCollection<Customer>(); 
    col.LoadWithLimit(criteria, "CustomerName", 0, 20, ref totalRecords); 
    return col; 
} 

这应该做到这一点! 请将答案直接授予Till,而不是我。他做了最多的研究。我只是纠正语法:)

编辑: 后低于约丑陋的API的意见,我会包括建议修改的方法,使它看起来更清洁(谢谢你的建议@GloryDe​​v):

public IEnumerable<Customer> FindCustomers(string partialCustomerName) 
{ 
    if (string.IsNullOrEmpty(partialCustomerName)) 
     throw new ArgumentException("partialCustomerName must be at least one character long"); 
    var col = new BusinessObjectCollection<Customer>(); 
    col.LoadWithLimit("CustomerName Like " + partialCustomerName + "%", "CustomerName", 20); 
    return col; 
} 

第二个参数是要排序的字段,这对于有限制的提取是必要的。希望这可以帮助。

+0

非常好,我正在寻找。 – Andrew 2011-06-02 14:40:00

+0

yikes什么是丑陋的api – 2011-06-02 14:46:06

+0

是的我更喜欢下面答案中的那个。这个使用lambdas的Create.Criteria是非常新的,据我所知,这就是Linq to Habanero在幕后使用的东西。我不确定这是否打算成为API。 – GloryDev 2011-06-02 19:05:56

2

我现在不能测试此权利,但你应该能够通过这种使用LoadWithLimit()方法。 totalRecords变量将保存找到的总结果数量,以防止包含“显示20条totalRecords结果”等信息。

public IEnumerable<Customer> FindCustomers(string partialCustomerName) 
{ 
    if (string.IsNullOrEmpty(partialCustomerName)) 
     throw new ArgumentException("partialCustomerName must be at least one character long"); 

    var criteria = Criteria.Create<Customer, string>(cust => cust.CustomerName, Criteria.ComparisonOp.Like, partialCustomerName + "%"); 
    int totalRecords; 
    return Broker.GetBusinessObjectCollection<Customer>().LoadWithLimit(criteria, 0, 20, ref totalRecords); 
} 
+0

感谢这个工程,但它似乎使调用数据库。 – Andrew 2011-06-02 14:39:33

+0

是的,这将调用数据库并在代理方法上加载所有客户,然后使用条件和限制重新加载该集合。 – 2011-06-03 08:16:08

1

Andrew 你总是可以做到这一点看起来有点整洁,但确实涉及到解析客户名称 。

 var totalRecords = 0; 
     Broker.GetBusinessObjectCollection<Customer>("CustomerName Like partialCustomerName ", "CustomerName", 0, 20, out totalRecords); 
+0

啊,真棒,我看到这个语法也被Broker支持。我更喜欢这个语法来解决我的问题:) – 2011-06-03 08:27:14

相关问题