2

考虑以下方法。在转发器绑定时,我遇到了异常。

绑定中继器:

private void BindRepeater()
{
    var idx = ListingPager.CurrentIndex;
    int itemCount;
    var keyword = Keywords.Text.Trim();
    var location = Area.Text.Trim();
    var list = _listing.GetBusinessListings(location, keyword, idx, out itemCount);
    ListingPager.ItemCount = itemCount;
    BusinessListingsRepeater.DataSource = list.ToList(); // exception here
    BusinessListingsRepeater.DataBind();
}

获取业务列表:

public IEnumerable<Listing> GetBusinessListings(string location, string keyword, int index, out int itemcount)
{
    var skip = GetItemsToSkip(index);
    var result = CompiledQueries.GetActiveListings(Context);
    if (!string.IsNullOrEmpty(location))
    {
      result= result.Where(c => c.Address.Contains(location));
    }
    if (!string.IsNullOrEmpty(keyword))
    {
        result = result.Where(c => c.RelatedKeywords.Contains(keyword) || c.Description.Contains(keyword));
    }
    var list = result;

    itemcount = list.Count();
    return result.Skip(skip).Take(10);

}

获取活动列表:

/// <summary>
///   Returns user specific listing
/// </summary>
public static readonly Func<DataContext, IQueryable<Listing>> GetActiveListings =
    CompiledQuery.Compile((DataContext db)
                          => from l in db.GetTable<Listing>()
                             where l.IsActive 
                             select l);
4

2 回答 2

6

当您分配时,itemcount您是第一次执行查询。你为什么需要这个?我的建议是不要在那里检索项目计数,而只是

return result.Skip(skip).Take(10).ToList();

基本上你不能同时拥有两者,只获取你需要的结果并在一个查询中检索总计数。不过,您可以使用两个单独的查询。

于 2012-11-28T18:19:48.513 回答
3

您可能希望将结果保存为一个集合,而不是一个IQueryable.

var list = result.ToArray();

itemcount = list.Length;
return list.Skip(skip).Take(10);

上面的代码可能不适合分页。您可能必须运行两次查询。

于 2012-11-28T18:15:35.653 回答