Benötige leider noch einmal Nachhilfe in linq

03/05/2008 - 02:54 von Ingo Manthey | Report spam
Hallo NG,

unter SQL würde ich folgendes schreiben.

SELECT FERTIG, SUM(MENGE)
FROM FK_PRODLAGERANF
WHERE FIRMA = 1 AND LAGER = 2 AND FERTIG is not null
GROUP BY FERTIG
ORDER BY FERTIG

unter linq versuche ich es leider schon seit stunden und komme irgendwie
nicht weiter.
var pList = from p in prodAnf
where p.FIRMENID == 1&&
p.FERTIG != null && p. == 2
group p by p.FERTIG into pp
select new { Datum = pp.FERTIG)

Fehler 1
"System.Linq.IGrouping<System.DateTime,Manthey.MaDB.DataBase.FK_PRODLAGERANF>"
enthàlt keine Definition für "FERTIG",
und es konnte keine Erweiterungsmethode "FERTIG" gefunden werden, die ein
erstes Argument vom Typ
"System.Linq.IGrouping<System.DateTime,Manthey.MaDB.DataBase.FK_PRODLAGERANF>"
akzeptiert.
???

Außerdem ist mir noch total unklar wie ich die Summe bilde. Ich habe es
bisher immer nur aus der pList mit pList.Sum(p => p.MENGE) gemacht
noch nie innerhalb einer Abfrage.

Danke im voraus für jeden Hinweis und Tipp.

Grüße Ingo
 

Lesen sie die antworten

#1 Peter Fleischer
03/05/2008 - 08:52 | Warnen spam
"Ingo Manthey" schrieb im Newsbeitrag
news:%

unter SQL würde ich folgendes schreiben.

SELECT FERTIG, SUM(MENGE)
FROM FK_PRODLAGERANF
WHERE FIRMA = 1 AND LAGER = 2 AND FERTIG is not null
GROUP BY FERTIG
ORDER BY FERTIG

unter linq versuche ich es leider schon seit stunden und komme irgendwie
nicht weiter.
var pList = from p in prodAnf
where p.FIRMENID == 1&&
p.FERTIG != null && p. == 2
group p by p.FERTIG into pp
select new { Datum = pp.FERTIG)

Fehler 1
"System.Linq.IGrouping<System.DateTime,Manthey.MaDB.DataBase.FK_PRODLAGERANF>"
enthàlt keine Definition für "FERTIG",
und es konnte keine Erweiterungsmethode "FERTIG" gefunden werden, die ein
erstes Argument vom Typ
"System.Linq.IGrouping<System.DateTime,Manthey.MaDB.DataBase.FK_PRODLAGERANF>"
akzeptiert.
???

Außerdem ist mir noch total unklar wie ich die Summe bilde. Ich habe es
bisher immer nur aus der pList mit pList.Sum(p => p.MENGE) gemacht
noch nie innerhalb einer Abfrage.



Hi Ingo,
mit VB.NET kann man deine Frage (analog zu SQL Anweisung) so lösen:

Option Infer On
Option Strict On

Module Module1

Sub Main()

Dim prodAnf As List(Of AnfItem) = GetData()

'SELECT FERTIG, SUM(MENGE)
'FROM FK_PRODLAGERANF
'WHERE FIRMA = 1 AND LAGER = 2 AND FERTIG is not null
'GROUP BY FERTIG
'ORDER BY FERTIG

Dim q = From p In prodAnf _
Where p.FIRMENID = 1 And _
p.FERTIG IsNot Nothing And p.LAGER = 2 _
Group By fertig = p.FERTIG _
Into Gesamtmenge = Sum(p.MENGE) _
Order By fertig

For Each itm In q
Console.Out.WriteLine("{0} {1}", _
itm.fertig, itm.Gesamtmenge)
Next

Console.ReadLine()
End Sub

Private Function GetData() As List(Of AnfItem)
Dim l As New List(Of AnfItem)
Dim obj1 = New clsFertig("fertig 1")
Dim obj2 = New clsFertig("fertig 2")
With l
.Add(New AnfItem With {.FIRMENID = 1, .LAGER = 2, _
.MENGE = 1.1D, .FERTIG = obj1})
.Add(New AnfItem With {.FIRMENID = 1, .LAGER = 2, _
.MENGE = 2.2D, .FERTIG = obj1})
.Add(New AnfItem With {.FIRMENID = 1, .LAGER = 2, _
.MENGE = 3.3D, .FERTIG = obj2})
.Add(New AnfItem With {.FIRMENID = 1, .LAGER = 2, _
.MENGE = 4.4D, .FERTIG = obj2})
.Add(New AnfItem With {.FIRMENID = 1, .LAGER = 2, _
.MENGE = 5.5D, .FERTIG = obj1})
.Add(New AnfItem With {.FIRMENID = 1, .LAGER = 2, _
.MENGE = 6.6D, .FERTIG = obj1})
.Add(New AnfItem With {.FIRMENID = 1, .LAGER = 2, _
.MENGE = 7.7D, .FERTIG = obj2})
.Add(New AnfItem With {.FIRMENID = 1, .LAGER = 2, _
.MENGE = 8.8D, .FERTIG = obj1})
End With
Return l
End Function

End Module

Public Class AnfItem
Private _FERTIG As Object
Public Property FERTIG() As Object
Get
Return _FERTIG
End Get
Set(ByVal value As Object)
_FERTIG = value
End Set
End Property
Private _FIRMENID As Integer
Public Property FIRMENID() As Integer
Get
Return _FIRMENID
End Get
Set(ByVal value As Integer)
_FIRMENID = value
End Set
End Property
Private _LAGER As Integer
Public Property LAGER() As Integer
Get
Return _LAGER
End Get
Set(ByVal value As Integer)
_LAGER = value
End Set
End Property
Private _MENGE As Decimal
Public Property MENGE() As Decimal
Get
Return _MENGE
End Get
Set(ByVal value As Decimal)
_MENGE = value
End Set
End Property
End Class

Public Class clsFertig
Implements IComparable
Private _s As String
Sub New(ByVal s As String)
_s = s
End Sub
Public Overrides Function ToString() As String
Return _s
End Function
Public Function CompareTo(ByVal obj As Object) _
As Integer Implements System.IComparable.CompareTo
Return String.Compare(_s, obj.ToString)
End Function
End Class

Viele Gruesse

Peter

Ähnliche fragen