Nicht in der Lage einen Konstanten Wert vom Typ 'Anonymen Typ'. Nur primitive Typen oder Aufzählungstypen unterstützt in diesem Zusammenhang
Ich bin extrem neu auf linq
- und entity framework. Ich bin versucht zu lösen ein problem, warum das unten nicht funktioniert. Die Fehler produziert, ist "Nicht in der Lage einen Konstanten Wert vom Typ 'Anonymen Typ'. Nur primitive Typen oder Aufzählungstypen unterstützt in diesem Zusammenhang."
Ich hab das versucht so viele verschiedene Möglichkeiten, aber immer noch einen Fehler in Bezug auf primitive Typen. Ich wäre sehr dankbar, wenn jemand könnte einen Blick auf den code unten, und hoffentlich zeigen, wo es falsch läuft.
public Entities.BikeData[] GetBikesWithExpiredSyncDeadline(int noOfDays) {
using (OfficeEntities cxt = GetContext())
using (ReportingEntities RepCxt = GetReportingContext()) {
Data.Repository.Abstract.IBikeRepository BikeRepos = new Data.Repository.Concrete.BikeRepository();
var details = (from sd in cxt.BikeDetails
where sd.autoreminder == true
&& (sd.lastremindersent == null || sd.lastremindersent < EntityFunctions.AddDays(DateTime.UtcNow, noOfDays * -1))
&& (sd.emailaddress != null && sd.emailaddress.Trim() != "")
select new {
Serial = sd.Serial,
EmailAddress = sd.emailaddress
}).ToList();
var resLst = (from r in RepCxt.RegisteredBikes
join d in details on r.Serial equals d.Serial
join cs in cxt.CompanySettings.ToList() on r.CompanyID equals cs.CompanyID
where (!r.lastupdate.HasValue || r.lastupdate < EntityFunctions.AddDays(DateTime.UtcNow, cs.AutoNotificationFrequency * -1))
select new Entities.BikeData {
ID = r.ID,
Name = r.Ship,
Serial = r.Serial,
LastUpdate = r.lastupdate,
DaysSinceLastSync = (r.lastupdate.HasValue? EntityFunctions.DiffDays(r.lastupdate.Value, DateTime.UtcNow).Value : -1),
EmailAddress = (d.EmailAddress == null ? string.Empty : (String.IsNullOrEmpty(d.EmailAddress) ? r.ShipEmailAddress : d.EmailAddress))
});
return resLst.ToArray();
}
}
UPDATE
Habe ich einen anderen Ansatz mit dieser jetzt durch das erstellen einer Ansicht so brauche ich nicht mehr zu tun, das Kreuz Kontext schließt sich in EF. Ich hatte gehofft, Sie möglicherweise in der Lage zu helfen, mit dem unten.
Wenn ich objectQuery.ToTraceString() es bietet mir mit Gültiger SQL, die Datensätze zurückgibt, die in die db, jedoch ist die resLst in Entity Framework kommt immer wieder bei 0 an. Gibt es etwas offensichtlich, warum dies passiert ist?
var resLst = (from ls in cxt.BikeLastUpdates
where (!ls.lastupdate.HasValue || ls.lastupdate < EntityFunctions.AddDays(DateTime.UtcNow, ls.AutoNotificationFrequency * -1))
&& (ls.autoreminder ==true)
&& (ls.lastremindersent == null || ls.lastremindersent < EntityFunctions.AddDays(DateTime.UtcNow, 3 * -1))
&& (ls.emailaddress !=null && ls.emailaddress.Trim() != "")
select new Entities.BikeData{
ID = (ls.ID ?? new Guid()),
Name = ls.Bike,
Serial = ls.Serial,
LastUpdate = ls.lastupdate,
EmailAddress = (String.IsNullOrEmpty(ls.emailaddress) ? ls.ShipEmailAddress : ls.emailaddress)
});
var objectQuery = resLst as ObjectQuery;
return resLst.ToArray();
- Für das update würde ich empfehlen, die Sql Server Profiler und der Erfassung der sql-EF ist tatsächlich an den server senden.
- Cheers mate. Dumme Verbindungszeichenfolge Problem. Sie Leben und lernen 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist die ToList () - Aufruf auf details. In EF, den Sie nur zu verweisen können, die eine IEnumerable-innerhalb einer Abfrage, wenn das IEnumerable-Schnittstelle von einem einfachen Typ (e. g. int). Jedoch, Sie KÖNNEN sich auf ein weiteres IQueryable. So fallen die ToList () - Aufruf sollte sich diese Arbeit machen.
EDIT: ebenso sollten Sie drop die ToList () - Aufruf auf ctx.CompanySettings.
Diese haben den zusätzlichen Vorteil der Ausführung nur 1 Abfrage, anstelle von 2. Wenn Sie drop die ToList() auf details, EF erzeugen so etwas wie:
EDIT: um dies zu tun über Kontexte, werden Sie brauchen, um die Abfrage in den Speicher (e. g. durch den Aufruf AsEnumerable() und führen Sie die entsprechenden joins gibt. Wenn die verbindungen als Filter fungieren, und es ist wichtig, für diese zu passieren, in SQL, sollten Sie die Verwendung der Contains(). Zum Beispiel