LINQ en échange de la couche d'affaires / tri gridview dans la couche utilisateur
-
12-10-2019 - |
Question
J'ai un gridview dans ma couche d'utilisateur qui utilise une méthode de couche métier comme source de données, et je veux le GridView support pagination et le tri. Quand je suis rentré IEnumerable de la méthode, il ramènera toutes les données. Si j'utilise Prenez / Saut pour ramener seulement une valeur de page, le gridview ne se rend pas compte qu'il ya beaucoup de pages de données.
Lorsque je change le IEnumerable en IQueryable, le DataBind () échoue parce que les données ont déjà été éliminés. Je pense que ce problème a quelque chose à voir avec lorsque la requête en fait l'exécution et il peut avoir à faire avec les filtres que je pose ma candidature à la requête (voir ci-dessous).
Code de Layer utilisateur:
grdSelectedQuestionaires.DataSource = assessment.FilteredAssessmentList(filter);
grdSelectedQuestionaires.DataBind(); <-- Fails - "Cannot access a disposed object"
Couche d'entreprise Code:
public IQueryable<Assessment> FilteredAssessmentList(AssessmentSearchFilter filter)
{
using (PAQcDataLayerDataContext dc = new PAQcDataLayerDataContext())
{
var rows = (
from a in dc.vPAQSummaries
select new Assessment()
{
PAQNumber = a.PAQNumber.Trim(),
CustomerID = (int)a.CustomerID,
Department = a.Department.Trim(),
CustomerName = a.CustomerName.Trim(),
DOTNumber = a.DOTNumber.Trim(),
OrgName = a.OrgName.Trim(),
DateEntered = a.DateEntered,
GroupNumber = a.GroupNumber.Trim(),
JobTitle = a.JobTitle.Trim(),
FileNames = a.FileNames.Trim(),
AnalystType = a.AnalystType.ToString(),
Incumbents = a.Incumbents,
});
// Filter by Customer ID
if (filter.CustomerID > 0)
{
rows = rows.Where(r => r.CustomerID == filter.CustomerID);
}
else
{
rows = rows.Where(r => r.CustomerID != null);
}
// Filter by DOT Number
if (!string.IsNullOrEmpty(filter.DOTNumberFrom))
{
if (string.IsNullOrEmpty(filter.DOTNumberTo))
{
rows = rows.Where(r => r.DOTNumber == filter.DOTNumberFrom);
}
else
{
rows = rows.Where(r => r.DOTNumber.CompareTo(filter.DOTNumberFrom) >= 0
&& r.DOTNumber.CompareTo(filter.DOTNumberTo) <= 0);
}
}
// Filter by OrgName
if (!string.IsNullOrEmpty(filter.OrgName))
{
rows = rows.Where(r => r.OrgName.StartsWith(filter.OrgName));
}
// Filter by Group
if (!string.IsNullOrEmpty(filter.GroupNumberFrom))
{
if (!string.IsNullOrEmpty(filter.GroupNumberTo))
{
rows = rows.Where(r => r.GroupNumber == filter.GroupNumberFrom);
}
else
{
rows = rows.Where(r => r.GroupNumber.CompareTo(filter.GroupNumberFrom) >= 0
&& r.GroupNumber.CompareTo(filter.GroupNumberTo) <= 0);
}
}
if (filter.Skip > 0)
{
rows = rows.Skip(filter.Skip);
}
if (filter.Take > 0)
{
rows = rows.Take(filter.Take);
}
else
{
rows = rows.Take(100);
}
return rows.Distinct();
}
}
}
La solution
Le problème de pagination a été provoquée par l'instruction Using. Changement de ceci:
using (PAQcDataLayerDataContext dc = new PAQcDataLayerDataContext())
{
...
}
à ceci:
PAQcDataLayerDataContext dc = new PAQcDataLayerDataContext();
fait un travail de recherche de personnes. Maintenant, je dois comprendre comment fonctionne le tri.