[LinqToSQL] ThenByDescending Lambda werkt niet met Anonymous

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024
Hey Guys,

Ik was bezig om een SQL query om te zetten naar Linq, maar bij het laatste puntje, de order by, gaat het even niet helemaal zoals het moet.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
        Dim sG = From GMS In BIBDB.Games _
        Select New With _
        { _
            .ID = GMS.ID, .Title = GMS.Title, _
            .OrderedQuantity = _
                DirectCast(IIf( _
                    (Aggregate O _
                    In BIBDB.Orders _
                    Where O.GameID = GMS.ID _
                    Into OQ = _
                        Sum(New Integer?(O.Quantity))).HasValue, _
                    (Aggregate O _
                    In BIBDB.Orders _
                    Where O.GameID = GMS.ID _
                    Into OQ = _
                        Sum(New Integer?(O.Quantity))).Value, 0), Integer), _
            .ExpectedNextDelivery = _
                (Aggregate O _
                In BIBDB.Orders _
                Where O.GameID = GMS.ID _
                Into ExpND = _
                    Min(New DateTime?(O.ExpectedDeliveryDate))), _
            .DeliveredStock = _
                DirectCast(IIf((Aggregate OD _
                In BIBDB.OrderDeliveries _
                Join O In BIBDB.Orders On O.ID Equals OD.OrderID _
                Where O.GameID = GMS.ID _
                Into DS = _
                    Sum(New Integer?(OD.DeliveredQuantity))).HasValue, _
                    (Aggregate OD _
                In BIBDB.OrderDeliveries _
                Join O In BIBDB.Orders On O.ID Equals OD.OrderID _
                Where O.GameID = GMS.ID _
                Into DS = _
                    Sum(New Integer?(OD.DeliveredQuantity))).Value, 0), Integer), _
            .PurchasedQuantity = _
                DirectCast(IIf((Aggregate IL _
                    In BIBDB.InvoiceLines _
                    Join I In BIBDB.Invoices On I.ID Equals IL.InvoiceID _
                    Where I.Test = 0 _
                        AndAlso (I.OrderStatus > 0 Or Now() < I.OrderDate.AddMinutes(2)) _
                        AndAlso IL.GameID = GMS.ID _
                    Into PQ = _
                        Sum(New Integer?(IL.Quantity))).HasValue, _
                    (Aggregate IL _
                    In BIBDB.InvoiceLines _
                    Join I In BIBDB.Invoices On I.ID Equals IL.InvoiceID _
                    Where I.Test = 0 _
                        AndAlso (I.OrderStatus > 0 Or Now() < I.OrderDate.AddMinutes(2)) _
                        AndAlso IL.GameID = GMS.ID _
                    Into PQ = _
                        Sum(IL.Quantity)), 0), Integer), _
            .RemainingStock = _
                DirectCast((Aggregate OD _
                In BIBDB.OrderDeliveries _
                Join O In BIBDB.Orders On O.ID Equals OD.OrderID _
                Where O.GameID = GMS.ID _
                Into DS = _
                    Sum(New Integer?(OD.DeliveredQuantity))) _
                    - _
                IIf((Aggregate IL _
                    In BIBDB.InvoiceLines _
                    Join I In BIBDB.Invoices On I.ID Equals IL.InvoiceID _
                    Where I.Test = 0 _
                        AndAlso (I.OrderStatus > 0 Or Now() < I.OrderDate.AddMinutes(2)) _
                        AndAlso IL.GameID = GMS.ID _
                    Into PQ = _
                        Sum(New Integer?(IL.Quantity))).HasValue, _
                        (Aggregate IL _
                    In BIBDB.InvoiceLines _
                    Join I In BIBDB.Invoices On I.ID Equals IL.InvoiceID _
                    Where I.Test = 0 _
                        AndAlso (I.OrderStatus > 0 Or Now() < I.OrderDate.AddMinutes(2)) _
                        AndAlso IL.GameID = GMS.ID _
                    Into PQ = _
                        Sum(IL.Quantity)), 0), Integer) _
        }
        sG = (sG.OrderByDescending(Function(x) x.PurchasedQuantity)).ThenByDescending(Function(x) x.RemainingStock)

Bij de OrderByDescending gaat het nog goed, daar heeft de IDE mooi door dat x = sG en exposed hij de properties (sorting werkt door de DirectCast terug naar integer bij de Iif's), maar zodra ik dan de tweede sorteer slag wil aangeven, geeft ie niet thuis, denk hij dat x een object is, en kan ik doen wat ik wil.

Run-time exception thrown : System.ArgumentException - The argument 'value' was the wrong type. Expected 'System.Int32'. Actual 'System.Object'.

Iemand enig idee hoe ik dit met mijn Anonymous Type kan oplossen? Ik heb al een work-around, een struct defineren en die in de With vullen, maar wil toch wel graag weten waarom dit niet werkt en hoe het wel zou moeten kunnen.

NKCSS - Projects - YouTube


Acties:
  • 0 Henk 'm!

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024
Het is maar een vreemd verhaal. Ik heb zelf nog een IComparer Class geschreven, maar dat mocht ook niet baten. Na een hoop proberen heb ik dan toch eindelijk een oplossing:

Dit werkt niet:
Visual Basic .NET:
1
Dim FailingSort = From x In sG Order By x.Purchased Descending, x.RemainingStock Descending

Dan krijg je: The argument 'value' was the wrong type. Expected 'System.Int32'. Actual 'System.Object'.

Deze werkt zonder problemen. Enige nadeel is natuurlijk wel dat alle results eerst moeten worden opgehaald.
Visual Basic .NET:
1
Dim WorkingSort = From x In sG.ToList Order By x.Purchased Descending, x.RemainingStock Descending

NKCSS - Projects - YouTube


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Komt denk ik door die directcast. Als je CInt() gebruikt werkt het denk ik wel.

Overigens is dit een query from hell. het lijkt me sterk dat deze query uberhaupt performed gezien de vele zware scalar queries die je in de projection hebt staan.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024
EfBe schreef op zaterdag 27 december 2008 @ 14:54:
Komt denk ik door die directcast. Als je CInt() gebruikt werkt het denk ik wel.

Overigens is dit een query from hell. het lijkt me sterk dat deze query uberhaupt performed gezien de vele zware scalar queries die je in de projection hebt staan.
Dat valt reuze mee, hij returned in 800ms

De directcast is hier niet het probleem, door de IIF constructie returned hij altijd een integer, maar de IIF maakt er een object van, ik zet alleen het type terug. Als hij daar mis ging kreeg je ook een andere exception.

NKCSS - Projects - YouTube