Vb.net 将参数从视图传递到实体框架OrderBy查询
我想知道如何从视图执行升序和降序查询。我目前的看法如下: 我理解我可以使用以下命令来订购视图:Vb.net 将参数从视图传递到实体框架OrderBy查询,vb.net,entity-framework,Vb.net,Entity Framework,我想知道如何从视图执行升序和降序查询。我目前的看法如下: 我理解我可以使用以下命令来订购视图: Dim retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderBy(Function(x) x.Id).ToList() 我想通过一个动作链接将列标题和升序或降序传递给方法?(上下箭头位于每个标题附近) OrderBy()不接受字符串。。。。有人能帮忙吗?多谢各位 控制器: ' G
Dim retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderBy(Function(x) x.Id).ToList()
我想通过一个动作链接将列标题和升序或降序传递给方法?(上下箭头位于每个标题附近)
OrderBy()不接受字符串。。。。有人能帮忙吗?多谢各位
控制器:
' GET: Dashboard
<Authorize(Roles:="Admin, Employee, User")>
Function Index() As ActionResult
Dim context = New ApplicationDbContext()
Dim UserManager = New UserManager(Of ApplicationUser)(New UserStore(Of ApplicationUser)(context))
Dim userLoggedIn = UserManager.FindById(User.Identity.GetUserId())
Dim retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderBy(Function(x) x.Id).ToList()
Dim BuildsVM = retrieveOrders.[Select](Function(build) New DashboardBuilds() With {
.BuildNumber = build.Id,
.DateCreated = build.TimeAndDate,
.MyRef = build.CustRef,
.NetCost = build.TotalNet
}).ToList()
Dim today = DateTime.Today.Date
Dim tomorrow = DateTime.Today.Date.AddDays(1)
Dim todaysBuild = retrieveOrders.Where(Function(build) build.TimeAndDate >= today And build.TimeAndDate <= tomorrow).ToList().Count()
Dim monthlyBuild = retrieveOrders.Where(Function(build) build.TimeAndDate.Year = today.Year And build.TimeAndDate.Month = today.Month).ToList().Count()
Dim yearlyBuild = retrieveOrders.Where(Function(build) build.TimeAndDate.Year = today.Year).ToList().Count()
Dim total As Decimal = BuildsVM.Sum(Function(item) item.NetCost)
Dim count As Integer = retrieveOrders.Count
Dim Average As Decimal = 0.00
If count > 0 Then
Average = total / count
End If
Dim model = New GroupedDashBoardBuilds() With {
.BuildInfos = BuildsVM,
.TotalNet = Math.Round(total, 2),
.AverageNet = Math.Round(Average, 2),
.TotalUserBuild = count,
.TotalUserBuildToday = todaysBuild,
.TotalUserBuildMonth = monthlyBuild,
.TotalUserBuildYear = yearlyBuild
}
Return View(model)
End Function
Function Index(strColumnName As String, bolAscending As Boolean) As ActionResult
获取:仪表板
函数Index()作为ActionResult
Dim context=新的ApplicationDbContext()
Dim UserManager=newusermanager(属于ApplicationUser)(newuserstore(属于ApplicationUser)(上下文))
Dim userLoggedIn=UserManager.FindById(User.Identity.GetUserId())
Dim retrieveOrders=context.PBBuilds.Where(函数(x)x.User=userLoggedIn.Id).OrderBy(函数(x)x.Id).ToList()
Dim BuildsVM=retrieveOrders。[选择](函数(构建)新仪表板构建()与{
.BuildNumber=build.Id,
.DateCreated=build.TimeAndDate,
.MyRef=build.CustRef,
.NetCost=build.TotalNet
})托利斯先生()
Dim today=DateTime.today.Date
Dim明天=DateTime.Today.Date.AddDays(1)
Dim todaysBuild=retrieveOrders.Where(函数(build)build.TimeAndDate>=今天和build.TimeAndDate 0然后
平均数=总数/计数
如果结束
Dim模型=新的GroupedDashBoardBuilds(),带有{
.BuildInfos=BuildsVM,
.TotalNet=数学四舍五入(总计2),
.AverageNet=数学四舍五入(平均,2),
.TotalUserBuild=count,
.TotalUserBuildToday=todaysBuild,
.TotalUserBuildMonth=monthlyBuild,
.TotalUserBuildYear=yearlyBuild
}
返回视图(模型)
端函数
因为您要将字段名以及它是否要升序或降序传递到控制器中:
' GET: Dashboard
<Authorize(Roles:="Admin, Employee, User")>
Function Index() As ActionResult
Dim context = New ApplicationDbContext()
Dim UserManager = New UserManager(Of ApplicationUser)(New UserStore(Of ApplicationUser)(context))
Dim userLoggedIn = UserManager.FindById(User.Identity.GetUserId())
Dim retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderBy(Function(x) x.Id).ToList()
Dim BuildsVM = retrieveOrders.[Select](Function(build) New DashboardBuilds() With {
.BuildNumber = build.Id,
.DateCreated = build.TimeAndDate,
.MyRef = build.CustRef,
.NetCost = build.TotalNet
}).ToList()
Dim today = DateTime.Today.Date
Dim tomorrow = DateTime.Today.Date.AddDays(1)
Dim todaysBuild = retrieveOrders.Where(Function(build) build.TimeAndDate >= today And build.TimeAndDate <= tomorrow).ToList().Count()
Dim monthlyBuild = retrieveOrders.Where(Function(build) build.TimeAndDate.Year = today.Year And build.TimeAndDate.Month = today.Month).ToList().Count()
Dim yearlyBuild = retrieveOrders.Where(Function(build) build.TimeAndDate.Year = today.Year).ToList().Count()
Dim total As Decimal = BuildsVM.Sum(Function(item) item.NetCost)
Dim count As Integer = retrieveOrders.Count
Dim Average As Decimal = 0.00
If count > 0 Then
Average = total / count
End If
Dim model = New GroupedDashBoardBuilds() With {
.BuildInfos = BuildsVM,
.TotalNet = Math.Round(total, 2),
.AverageNet = Math.Round(Average, 2),
.TotalUserBuild = count,
.TotalUserBuildToday = todaysBuild,
.TotalUserBuildMonth = monthlyBuild,
.TotalUserBuildYear = yearlyBuild
}
Return View(model)
End Function
Function Index(strColumnName As String, bolAscending As Boolean) As ActionResult
您可以在如下选择的情况下实现逻辑:
Dim retrieveOrders As List(Of PBBuilds) = Nothing
Select Case strColumnName
Case "Build"
If bolAscending Then
retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderBy(Function(x) x.Id).ToList()
Else
retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderByDescending(Function(x) x.Id).ToList()
End If
Case "My Reference"
If bolAscending Then
retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderBy(Function(x) x.FieldRelatedToMyReference).ToList()
Else
retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderByDescending(Function(x) x.FieldRelatedToMyReference).ToList()
End If
'Implement for Other Cases
End Select
Dictionary<string, Func<User, object>> ColumnAccessorMap = new Dictionary<string, Func<User, object>>()
{
{ "Build", user => user.ID },
{ "My Reference", user => user.MyReferenceProperty }
}
// etc...
context.MyTable.ToList().OrderBy(ColumnAccessorMap[strColumnName]);
如果您不关心数据库上运行的
OrderBy
,可以执行以下操作:
Dim retrieveOrders As List(Of PBBuilds) = Nothing
Select Case strColumnName
Case "Build"
If bolAscending Then
retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderBy(Function(x) x.Id).ToList()
Else
retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderByDescending(Function(x) x.Id).ToList()
End If
Case "My Reference"
If bolAscending Then
retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderBy(Function(x) x.FieldRelatedToMyReference).ToList()
Else
retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderByDescending(Function(x) x.FieldRelatedToMyReference).ToList()
End If
'Implement for Other Cases
End Select
Dictionary<string, Func<User, object>> ColumnAccessorMap = new Dictionary<string, Func<User, object>>()
{
{ "Build", user => user.ID },
{ "My Reference", user => user.MyReferenceProperty }
}
// etc...
context.MyTable.ToList().OrderBy(ColumnAccessorMap[strColumnName]);
本质上,将列映射到访问器函数,该函数告诉排序时使用的
OrderBy
属性。同样,如果没有前面的.ToList
调用,这将无法工作,这意味着排序是在本地进行的,而不是在SQL中进行的。您始终可以执行查询,然后排序,我的意思是,首先获取数据,然后切换案例顺序?抱歉,这是另一个问题中的C#谢谢,我正在寻找一种更简洁的方法,但我想这是不可能的,我在上面计算过。我更感兴趣的是如何创建html操作帮助程序来将信息传递给该方法