When using "Filter Multi Checkboxes " I get an error saying cannot convert CompositeFilterDescriptor
to FilterDescriptor . on this line "For Each filterDescriptor As FilterDescriptor In request.Filters"
I understand the error, but how to get around it,
thanks
Imports Kendo.Mvc
Imports System.ComponentModel
Imports System.Collections.ObjectModel
Imports System.Data.Entity
Namespace Models.Students
Public Class StudentGridModel
Public Property PageSize As Integer = 25
Private _Students As ReadOnlyCollection(Of BO.Models.Students.Student)
<
System.Diagnostics.CodeAnalysis.SuppressMessage
("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")> Public Property Students As ReadOnlyCollection(Of BO.Models.Students.Student)
Get
Return _Students
End Get
Set(value As ReadOnlyCollection(Of BO.Models.Students.Student))
_Students = value
End Set
End Property
Public Property Total As Integer
Sub New()
Using db As EF.GrasshopperEntities = New EF.GrasshopperEntities
Me._Students = New ReadOnlyCollection(Of BO.Models.Students.Student)(db.Students.Include(Function(i) i.Franchisee).OrderBy(Function(o) o.StudentId).Take(Me.PageSize).AsEnumerable.Select(Function(s) New BO.Models.Students.Student With {
.FirstName = s.FirstName,
.FranchiseeName = s.Franchisee.Name,
.LastName = s.LastName,
.Age = s.Age,
.Birthday = s.Birthday,
.Female = s.Female,
.Suburb = s.Suburb,
.PhoneNumber = s.PhoneNumber,
.MobileNumber = s.MobileNumber,
.Email = s.Email,
.TotalSales = s.Sales(),
.ProductSales = s.Sales(Function(t) Not t.ProductId.Equals(0)),
.EnrolmentSales = s.Sales(Function(t) Not t.EnrolmentId.Equals(0)),
.EventSales = s.Sales(Function(t) Not t.StudentEventId.Equals(0)),
.StudentId = s.StudentId}).ToList)
Me.Total = db.Students.Count
End Using
End Sub
Sub New(request As UI.DataSourceRequest)
Using db As EF.GrasshopperEntities = New EF.GrasshopperEntities
Me._Students = New ReadOnlyCollection(Of BO.Models.Students.Student)(GetData(request, Me.Total))
End Using
End Sub
''' <
summary
>
''' Reterns student data for kendo grid
''' </
summary
>
''' <
param
name
=
"request"
>Kendo.Mvc.UI.DataSourceRequest</
param
>
''' <
param
name
=
"Total"
>Integer</
param
>
''' <
returns
>ReadOnlyCollection(Of BO.Models.Students.students)</
returns
>
''' <
remarks
></
remarks
>
Private Shared Function GetData(ByVal request As Kendo.Mvc.UI.DataSourceRequest, ByRef total As Integer) As ReadOnlyCollection(Of BO.Models.Students.Student)
Using db As EF.GrasshopperEntities = New EF.GrasshopperEntities
Dim data As IQueryable(Of EF.Student) = db.Students.Include(Function(i) i.Franchisee)
If Not request.Sorts Is Nothing AndAlso request.Sorts.Any Then
For Each sortDescriptor As SortDescriptor In request.Sorts
data = SortStudent(sortDescriptor, data)
Next
Else
data = data.OrderBy(Function(o) o.StudentId)
End If
If request.Filters.Any() Then
Dim filterValue As String = String.Empty
For Each filterDescriptor As FilterDescriptor In request.Filters
Select Case filterDescriptor.Member
Case "FranchiseeName"
filterValue = CStr(filterDescriptor.ConvertedValue)
Select Case filterDescriptor.Operator
Case FilterOperator.Contains
data = data.Where(Function(w) w.Franchisee.Name.Contains(filterValue))
Case FilterOperator.DoesNotContain
data = data.Where(Function(w) Not w.Franchisee.Name.Contains(filterValue))
Case FilterOperator.EndsWith
data = data.Where(Function(w) w.Franchisee.Name.EndsWith(filterValue))
Case FilterOperator.IsEqualTo
data = data.Where(Function(w) w.Franchisee.Name.Equals(filterValue))
Case FilterOperator.IsNotEqualTo
data = data.Where(Function(w) Not w.Franchisee.Name.Equals(filterValue))
Case FilterOperator.StartsWith
data = data.Where(Function(w) w.Franchisee.Name.StartsWith(filterValue))
End Select
End Select
Next
End If
If request.Filters.Any() Then
data = data.Where(ExpressionBuilder.Expression(Of EF.Student)(request.Filters))
End If
total = data.Count
If request.PageSize > 0 Then
data = data.Skip((request.Page - 1) * request.PageSize)
data = data.Take(request.PageSize)
End If
Return New ReadOnlyCollection(Of BO.Models.Students.Student)(data.AsEnumerable.Select(Function(s) New BO.Models.Students.Student With {
.FranchiseeName = s.Franchisee.Name,
.FirstName = s.FirstName,
.LastName = s.LastName,
.Age = s.Age,
.Birthday = s.Birthday,
.Female = s.Female,
.Suburb = s.Suburb,
.PhoneNumber = s.PhoneNumber,
.MobileNumber = s.MobileNumber,
.Email = s.Email,
.TotalSales = s.Sales(),
.ProductSales = s.Sales(Function(t) Not t.ProductId.Equals(0)),
.EnrolmentSales = s.Sales(Function(t) Not t.EnrolmentId.Equals(0)),
.EventSales = s.Sales(Function(t) Not t.StudentEventId.Equals(0)),
.StudentId = s.StudentId}).ToList)
End Using
End Function
Private Shared Function SortStudent(sortDescriptor As SortDescriptor, data As IQueryable(Of EF.Student)) As IQueryable(Of EF.Student)
If sortDescriptor.SortDirection.Equals(ListSortDirection.Ascending) Then
Select Case sortDescriptor.Member
Case "StudentId"
data = data.OrderBy(Function(o) o.StudentId)
Case "FranchiseeName"
data = data.OrderBy(Function(o) o.Franchisee.Name)
Case "FirstName"
data = data.OrderBy(Function(o) o.FirstName)
Case "LastName"
data = data.OrderBy(Function(o) o.LastName)
Case "Age"
data = data.OrderBy(Function(o) o.Birthday)
Case "Female"
data = data.OrderBy(Function(o) o.Female)
Case "Suburb"
data = data.OrderBy(Function(o) o.Suburb)
End Select
Else
Select Case sortDescriptor.Member
Case "StudentId"
data = data.OrderByDescending(Function(o) o.StudentId)
Case "FranchiseeName"
data = data.OrderByDescending(Function(o) o.Franchisee.Name)
Case "FirstName"
data = data.OrderByDescending(Function(o) o.FirstName)
Case "LastName"
data = data.OrderByDescending(Function(o) o.LastName)
Case "Age"
data = data.OrderByDescending(Function(o) o.Birthday)
Case "Female"
data = data.OrderByDescending(Function(o) o.Female)
Case "Suburb"
data = data.OrderByDescending(Function(o) o.Suburb)
End Select
End If
Return data
End Function
End Class
End Namespace