EF Kern konnte nicht übersetzt werden und werden lokal ausgewertet
Ich habe eine Abfrage in EF-Core 1.1.2 ausgewertet wird auf client-Seite und würde gerne wissen, ob es einen besseren Weg gibt, um es zu übersetzen in sql?
Abfrage:
from l in _ctx.Locations
join i in _ctx.Inventories on l.Id equals i.LocationId
join it in _ctx.Items on i.ItemId equals it.Id
where l.ProjectId == projectid
group i by new {l.Id, l.LHA} into il
select new InventoryLocations() {
Id= il.Key.Id,
LHA = il.Key.LHA,
FlaggedItems = il.Any(x=>x.Item != null && x.Item.Flagged)
}
Wenn nicht, welche anderen Optionen habe ich?
- Wie ich wissen, dass es noch keine Möglichkeit, das mapping Ansichten.
- FromSQL () - Methode zurückgeben kann, Arten, die bereits in den bekannten Rahmen nur und ich kann nicht daneben ein Modell wie [NotMapped] zum Beispiel.
- Bewegen zurück zu ef6 ist keine option da .net core ist das Ziel-framework.
Modelle:
public class Location
{
public Guid Id { get; set; }
[ForeignKey("Project")]
public Guid ProjectId { get; set; }
public Project Project {get; set; }
public string Name { get; set; }
public string LHA { get; set; }
[ForeignKey("ScanUser")]
public Guid? ScanUserId { get; set; }
public User ScanUser { get; set; }
[ForeignKey("CheckUser")]
public Guid? CheckUserId { get; set; }
public User CheckUser { get; set; }
[ForeignKey("GroupLeader")]
public Guid? GroupLeaderId { get; set; }
public User GroupLeader { get; set; }
public int State { get; set; }
}
public class Inventory
{
public Guid Id { get; set; }
[ForeignKey("Project")]
public Guid ProjectId { get; set; }
public Project Project {get; set; }
public string EANCode { get; set; }
[ForeignKey("Location")]
public Guid LocationId { get; set; }
public Location Location { get; set; }
public Double ScanQty { get; set; }
[ForeignKey("ScanUser")]
public Guid? ScanUserId { get; set; }
public User ScanUser { get; set; }
public DateTime? ScanDate { get; set; }
[ForeignKey("Item")]
public Guid? ItemId { get; set; }
public Item Item { get; set; }
[ForeignKey("InventoryTask")]
public Guid? InventoryTaskId { get; set; }
public InventoryTask InventoryTask { get; set; }
[ForeignKey("CheckUser")]
public Guid? CheckUserId { get; set; }
public User CheckUser { get; set; }
public DateTime? CheckDate { get; set; }
public Double PrevQty { get; set; }
}
public class Item
{
public Guid Id { get; set; }
[ForeignKey("Project")]
public Guid ProjectId { get; set; }
public Project Project {get; set; }
public string ItemNo { get; set; }
public string EANCode { get; set; }
public string Name { get; set; }
public Double Price { get; set; }
public bool Deleted { get; set; }
public DateTime ChangeTime { get; set; }
public Double BaseQty { get; set; }
public bool Flagged { get; set; }
}
Vermeiden
Ich habe meine Modelle. Inventar.Element existiert, aber ich habe keinen Ort.Die Vorräte. Könnte es irgendwie helfen? Der Antrag behandelt mehrere Projekte, so Lage, item und Inventar sind ziemlich große Datenmengen. (~2-3M Elemente und ~4-5 Lagerbestände pro Artikel)
Ihre
Ich denke, es kann so genutzt werden als Guid ProjectId ist ein Fremdschlüssel, der von ef-Namenskonvention. Meine ForeignKey-Attribute sind nur Punkte auf der rechten Navigations-Eigenschaft.
Mit
GroupBy
Abfragen, wenn möglich. Blick auf die geposteten Abfrage, sollte es machbar sein - weder Verknüpfungen noch group by benötigt wird. Hoffe, Sie haben navigation Eigenschaften wie Location.Inventories
und Inventory.Item
? Kannst du die entity-Modellen?Ich habe meine Modelle. Inventar.Element existiert, aber ich habe keinen Ort.Die Vorräte. Könnte es irgendwie helfen? Der Antrag behandelt mehrere Projekte, so Lage, item und Inventar sind ziemlich große Datenmengen. (~2-3M Elemente und ~4-5 Lagerbestände pro Artikel)
Ihre
[ForeignKey]
Attribute falsch sind. Sie sollte auf der navigation-Eigenschaft und Referenz der key-Feld-z.B. [ForeignKey("ProjectId")] public Project Project { get; set; }
.Ich denke, es kann so genutzt werden als Guid ProjectId ist ein Fremdschlüssel, der von ef-Namenskonvention. Meine ForeignKey-Attribute sind nur Punkte auf der rechten Navigations-Eigenschaft.
Mit
ProjectId
etc. konform zu Namenskonventionen und EF wäre mit dieser zu bestimmen, die Beziehungen. Aber Ihre Nutzung der [ForeignKey]
- Attribut ist falsch und dient absolut keinen Zweck. Ich bin überrascht, dass EF nicht eine exception werfen, wenn Sie die Erstellung Ihrer Migrationen, aber es muss sein, ihn zu ignorieren, weil es bereits herausgefunden, die Beziehungen durch Namensgebung. docs.microsoft.com/en-us/ef/core/modeling/relationships
InformationsquelleAutor Perrier | 2017-07-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Derzeit (und sieht auch in der eingehenden EF-Core v. 2.0) die
GroupBy
Abfragen lokal verarbeitet werden, so dass der Schlüssel ist, Sie zu vermeiden, wo möglich.Und die Abfrage scheint berechtigt zu sein, gibt es keine Notwendigkeit, zuerst multiplizieren der Daten mit Verknüpfungen und dann die Gruppe zurück.
Habe ich bemerkt, dass Sie verwenden Sie nur Referenz navigation Eigenschaften und FKs in Ihren Entitäten, im Grunde wie Datenbank-Tabelle-Datensatz und SQL. Aber EF können Sie definieren, auch eine entsprechende Sammlung navigation Eigenschaften, die Ihnen erlauben, Abfragen zu starten, die aus der logischen Stamm, wodurch die Notwendigkeit für joins und group by.
Wenn Sie definieren navigation Eigenschaft von
Location
zuInventory
dann die entsprechende Abfrage könnte einfach sein:
vollständig in SQL übersetzt.
Wenn aus irgendeinem Grund können Sie nicht erstellen Sie die obige Auflistung navigation Eigentum, noch können Sie beginnen, mit Standorten und manuell korrelieren Sie mit den Vorräten:
InformationsquelleAutor Ivan Stoev
Wenn Sie fügen Sie die navigation Eigenschaft wie Ivan richtig deutet:
Dann können Sie einfach erstellen Sie eine Abfrage wie diese:
InformationsquelleAutor Brad