2012-04-09 15 views
0

Ich habe diese Methode, die ich als schrieb:Linq to Entities-Abfrage nicht Urtyp

private void GetReceivedInvoiceTasks(User user, List<Task> tasks) 
     { 
      var taskList = from i in _db.Invoices 
          join a in user.Areas on i.AreaId equals a.AreaId 
          where i.Status == InvoiceStatuses.Received 
          select i; 

     } 

Grundsätzlich ich versuchte, in den Bereich der Benutzer alle Rechnungen in der Datenbank zu erhalten, die einen Status erhalten haben. Ich verstehe Linq jetzt nicht gut.

Ich erhalte die Fehlermeldung:

Basis {System.SystemException} = { "Kann nicht einen konstanten Wert des Typs 'Models.Area' nur primitive Typen ('wie Int32, String erstellen, und. Guid ') werden in diesem Zusammenhang unterstützt. "}

Kann mir bitte jemand erklären, was ich falsch mache und wie man das beheben kann? Ich kann derzeit nicht verstehen, was das Problem ist. Wenn ich die Join-Linie nehme, ist es in Ordnung, aber ich brauche diese Zeile wirklich, um sicherzustellen, dass ich nur Rechnungen aus dem Benutzerbereich/den Benutzerbereichen habe (sie können zu mehr als einem Bereich gehören). Habe ich etwas grundsätzlich falsch mit dieser Abfrage.

Antwort

4

Das Entitätsframework unterstützt keine Joins mit In-Memory-Sammlungen. Sie müssen Ihre Abfrage neu verkabeln, um stattdessen eine Contains Abfrage mit einer Sammlung von Primitiven zu verwenden.

Auch EF unterstützt derzeit keine Enum-Werte, daher müssen Sie mit einem ganzzahligen Wert vergleichen (Wenn InvoiceStatuses.Received kein enum Wert ist, ignorieren Sie diesen Teil).

Beiden Korrekturen führen zu dem folgenden Abfrage Ansatz kombiniert, die in den Ergebnissen entsprechen Ihr beitreten führen sollen:

int statusReceived = (int)InvoiceStatuses.Received; 
var areaIds = user.Areas.Select(x=> x.AreaId).ToArray(); 

var taskList = from i in _db.Invoices 
       where i.Status == statusReceived && areaIds.Contains(i.AreaId) 
       select i;