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

GetBusinessListings:

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

}

GetActiveListings :

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

基本的に両方を持つことはできません。必要な結果のみをフェッチし、1 つのクエリで合計数を取得します。ただし、2 つの個別のクエリを使用できます。

于 2012-11-28T18:19:48.513 に答える
3

結果を、ではなくコレクションとして保持することをお勧めしますIQueryable

var list = result.ToArray();

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

上記のコードは、ページングに対して正しくない可能性があります。クエリを2回実行する必要がある可能性があります。

于 2012-11-28T18:15:35.653 に答える