Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 将参数从视图传递到实体框架OrderBy查询_Vb.net_Entity Framework - Fatal编程技术网

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操作帮助程序来将信息传递给该方法