verwendetes Datenbanksystem: <Ms Microsoft SQL>
Ich versuche gerade aus einer Datenbank eine Liste zu holen.
Siehe to.List()
und das dann als Parameter zu übergeben, damit ich es als schleife zählen kann.
Leider gibt der Compiler hier einen Fehler aus, da er den Typ nicht lesen kann.
Wie ihr am Code sehen könnnt:
public void InsertPilot()
{
var pilotgroup = (from l in db.lg7
join c in db.catalog on l.NUMBER.ToString() equals c.ObjId
where c.IdObj == "10"
&& (l.ENDDATE > time1 && l.ENDDATE <= time2)
orderby l.EN_ENDDATE
select l)
.GroupBy(l => l.NUMBER)
.Select(group => new
{
pilotId = group.Key,
NUMBER = group.FirstOrDefault().NUMBER,
Date = currentDate.ToString("yydMM", System.Globalization.CultureInfo.CreateSpecificCulture("en-US")),
// ...
EndDateCallsReceived = group.Where(lg => STATE == 0
//…
).Select(lg => lg.ENDDATE).ToList()
})
;
foreach (var p in pilotgroup)
{
Pilot pilot = new Pilot
{
pilot_number = p.EN_PILOTNUMBER.ToString(),
date = p.Date,
calls_received = p.CallsReceived,
//First Error because it don´t except the List
maximum_number_of_simultaneous_calls = rc.MaximumNumberOfSimultaneousCalls(p.CallsReceived, p.EndDateCallsReceived, p.StartDateCalls),
//…
};
}
}
}
public int MaximumNumberOfSimultaneousCalls(int callsRecieved, List<int> endDate, List<int> startDate)
{
if(callsRecieved == 0)
{ return 0;}
else if (callsRecieved == 1)
{ return 1; }
else
{
var maxCallsCount = 0;
foreach (var second in Enumerable.Range(startDate.FirstOrDefault(),
endDate.FindLast() - startDate.FirstOrDefault() + 1))
{
var callsCount = 0;
for (var i = 0; i < startDate.Length; ++i)
{
if ( startDate[i]<= second && second <= endDate[i])
{
++callsCount;
}
}
if (callsCount > maxCallsCount)
{
maxCallsCount = callsCount;
}
}
return maxCallsCount;
}
return 0;
}
Leider gibt der Compiler hier einen Fehler aus, da er den Typ nicht lesen kann.
Und wie lautet die Fehlermeldung? Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 5 und [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)
Grüße
**:::
Fehlermeldung:
2-Argument: Kann nicht von "System.Collections.Generic.List<int?>" in "System.Collections.Generic.List<int>" konvertiert werden. c:\users\user\documents\visual studio 2013\projects\creportgenerator\creportgenerator\piloteinfuegen.cs
Int ist eigentlich ein Wertetyp und kann nicht null sein. int? ist aber nullable und nützlich für Datenbanken --> Datenbankfeld nicht gefüllt. int? kann also null sein.
Vermutung wäre jetzt aus deiner List<int> eine List<int?> zu machen, wobei ich nicht sicher bin was EndDateCallsReceived eigentlich für ein Typ ist
Ah das würde ja Sinn machen, denn meine Typ ist List<int?>.
Kann ich das auch so machen, dass ich den fest auf List<int> setzen?
Danke schonmal für eure Antworten ich habe das nun mit List<int?> versucht.
Dabei erscheint aber folgendes Problem:
Erstmal der Code:
foreach (var second in Enumerable.Range((int)beginningDate.FirstOrDefault(),
(int)endDate.Last() - (int)beginningDate.FirstOrDefault()))
{
var callsCount = 0;
for (var i = 0; i < beginningDate.Last(); ++i)
{
//hier wird der Fehler angezeigt.
if (beginningDate[i] <= second && second <= endDate[i])
{
++callsCount;
}
}
if (callsCount > maxCallsCount)
{
maxCallsCount = callsCount;
}
}
Fehlermeldung: > Fehlermeldung:
Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Auflistung sein.
Hier liegt das Problem daran, dass genau dadurch, dass hier ein List<int?>
verwendet wird, auch null vorkommen darf. Das liegt aber ausserhalb des indexes.
Ich weiß aber nicht wie ich das vermeiden kann.
Natürlich kann ich eine try-catch exception drum machen.
Aber das macht die Abfrage so unglaublich langsam. Ich hab nun statt 2 min Abfrage.
15 min... Das ist kein optimaler Weg.
Hier liegt das Problem daran, dass genau dadurch, dass hier ein List<int?>
verwendet wird, auch null vorkommen darf. Das liegt aber ausserhalb des indexes.
Ich weiß aber nicht wie ich das vermeiden kann.
Da du mit NULL-Werte nichts anfangen kannst, muss du die DB-Abfrage soweit ändern, dass diese im Ergebnis nicht vorkommen.
**:::