다음과 같은 방법을 고려하십시오. 리피터 바인딩 동안 나는 요청에 따라 예외를 얻고있다.
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);
할당 할 때itemcount
당신은 쿼리를 처음 실행하고 있습니다. 왜 이것을 필요로합니까?
내 제안은 항목 수를 검색하지 않는 것입니다.
return result.Skip(skip).Take(10).ToList();
기본적으로 두 가지를 모두 가질 수는 없으며 필요한 결과 만 가져오고 하나의 쿼리에서 총 수를 검색 할 수는 없습니다. 당신은 2 개의 분리 된 querys를 사용할 수 있었다.
결과를 컬렉션이 아닌 컬렉션으로 유지할 수 있습니다.IQueryable
.
var list = result.ToArray();
itemcount = list.Length;
return list.Skip(skip).Take(10);
위의 코드는 페이징에 맞지 않을 수 있습니다. 쿼리를 두 번 실행해야합니다.
Queryable.Skip
과Queryable.Take
따라서 OP 코드는 아직 작동하지 않는 경우에도 유연하게 설계되었습니다. 답변에서 다음으로 변경되었습니다.Enumerable.Skip
과Enumerable.Take
. - user743382