LINQ in Business Layer Paging / Sortieranlagen gridview in Benutzerebene
-
12-10-2019 - |
Frage
Ich habe eine Gridview in meiner Benutzerschicht, die ein Business-Schicht-Verfahren als Datenquelle verwendet, und ich mag die Gridview Unterstützung Paging und Sortieren. Wenn ich ein IEnumerable aus dem Verfahren zurückgegeben wird, wird es alle Daten zurückbringen. Wenn ich nur, um wieder einen Wert von Seite Take / Überspringen verwenden, wird der gridview nicht erkennen, dass es viele Seiten von Daten sind.
Wenn ich die IEnumerable in ein IQueryable ändern, schlägt die DataBind (), weil die Daten bereits entsorgt worden ist. Ich denke, das Problem hat etwas mit dem zu tun, wenn die Abfrage tatsächlich ausführt, und es kann mit den Filtern zu tun, habe ich auf die Abfrage beantrage (siehe unten).
User Layer-Code:
grdSelectedQuestionaires.DataSource = assessment.FilteredAssessmentList(filter);
grdSelectedQuestionaires.DataBind(); <-- Fails - "Cannot access a disposed object"
Business Layer 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();
}
}
}
Lösung
Das Paging-Problem wurde durch die Verwendung von Anweisung verursacht. Dies zu ändern:
using (PAQcDataLayerDataContext dc = new PAQcDataLayerDataContext())
{
...
}
folgt aus:
PAQcDataLayerDataContext dc = new PAQcDataLayerDataContext();
Aus Paging-Arbeit. Jetzt muss ich herausfinden, wie funktioniert das Sortieren.