1

다음과 같은 방법을 고려하십시오. 리피터 바인딩 동안 나는 요청에 따라 예외를 얻고있다.

Bindrepeater :

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

2 답변


5

할당 할 때itemcount당신은 쿼리를 처음 실행하고 있습니다. 왜 이것을 필요로합니까? 내 제안은 항목 수를 검색하지 않는 것입니다.

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

기본적으로 두 가지를 모두 가질 수는 없으며 필요한 결과 만 가져오고 하나의 쿼리에서 총 수를 검색 할 수는 없습니다. 당신은 2 개의 분리 된 querys를 사용할 수 있었다.


2

결과를 컬렉션이 아닌 컬렉션으로 유지할 수 있습니다.IQueryable.

var list = result.ToArray();

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

위의 코드는 페이징에 맞지 않을 수 있습니다. 쿼리를 두 번 실행해야합니다.


  • 데이터베이스에서 10 개의 항목을 검색하는 대신 데이터베이스의 모든 항목을 검색하여 대부분의 항목을 버립니다. - user743382
  • @hvd correct. ops 코드는 그렇게 유연하지 않습니다. - Daniel A. White
  • OP 코드는Queryable.SkipQueryable.Take따라서 OP 코드는 아직 작동하지 않는 경우에도 유연하게 설계되었습니다. 답변에서 다음으로 변경되었습니다.Enumerable.SkipEnumerable.Take. - user743382

연결된 질문


관련된 질문

최근 질문