मैं सोच रहा हूं कि मैं एक दृश्य से आरोही और अवरोही क्वेरी कैसे कर सकता हूं। मेरा वर्तमान दृश्य नीचे जैसा है:

enter image description here

मैं समझता हूं कि मैं निम्नलिखित का उपयोग करके दृश्य का आदेश दे सकता हूं:

Dim retrieveOrders = context.PBBuilds.Where(Function(x) x.User = userLoggedIn.Id).OrderBy(Function(x) x.Id).ToList()

मैं कॉलम शीर्षक और आरोही या अवरोही को एक क्रिया लिंक से विधि में पास करना चाहता हूं जो मुझे लगता है? (ऊपर और नीचे तीर प्रत्येक शीर्षक के पास स्थित है)।

ऑर्डरबी () एक स्ट्रिंग स्वीकार नहीं करता है .... क्या कोई कृपया मदद कर सकता है? धन्यवाद

नियंत्रक:

   ' 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
0
A Houghton 17 मार्च 2017, 22:36

2 जवाब

सबसे बढ़िया उत्तर

चूंकि आप फ़ील्ड नाम पास कर रहे होंगे और इसे नियंत्रक में आरोही या अवरोही क्रमबद्ध करना है या नहीं:

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
1
NoAlias 17 मार्च 2017, 23:29

यदि आप डेटाबेस पर चल रहे OrderBy के बारे में परवाह नहीं करते हैं, तो आप ऐसा कुछ कर सकते हैं:

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]);

या VB.NET में (हाथ से परिवर्तित, लंबे समय से VB का उपयोग नहीं किया है)

Dim ColumnAccessorMap as new Dictionary(of String, Object) From {{ "Build", Function(u) u.ID }, { "My Reference", Function(u) u.MyRefProperty }}

'... etc

context.MyTable.ToList().OrderBy(ColumnAccessorMap(strColumnName))

अनिवार्य रूप से, एक एक्सेसर फ़ंक्शन के लिए एक कॉलम को मैप करना जो OrderBy को बताता है कि सॉर्ट करते समय किस संपत्ति का उपयोग करना है। दोबारा, यह .ToList कॉल के बिना काम नहीं करेगा, जिसका अर्थ है कि सॉर्ट स्थानीय रूप से होता है, SQL में नहीं।

0
MrZander 18 मार्च 2017, 00:53