2016-04-07 4 views
1

ich einige Unternehmen haben Logging die ILogging implementiert, lassen Sie uns sagen, dass es nur zwei Eigenschaften hat:Allgemeine Klasse mit Ausdrücken wirft Fehler in Linq-To-Entities

public partial class Logging : ILogging 
{ 
    public int ID {get; set;} 
    public string Name {get; set;} 
} 
public interface ILogging { int ID {get; set;} } 

ich ursprünglich eine statische Klasse Logging.Q hatte die statische Expression<Func<Logging,bool>> enthält Felder, aber jetzt möchte ich in der Lage sein, die Ausdrücke für ILogging zu schreiben, wenn sie nur ID brauchen:

public partial class Logging 
{ 
    public static Q<T> where T : ILogging 
    { 
     public static Expression<Func<T,bool>> IDOne = l => l.ID == 1; 
    } 
} 

wenn ich den Ausdruck wie folgt aufrufen:

var log = ctx.Logging.Where(Logging.Q<Logging>.IDOne).FirstOrDefault(); 

ich die berüchtigten "Linq zu Entitäten unterstützt nur ...":

kann nicht den Typ 'Entities.Logging' eingeben 'Entities.ILogging' werfen. LINQ to Entities unterstützt nur das Importieren von EDM-Primitiv- oder Aufzählungstypen.

Aber ich weiß nicht warum. Ich definiere meinen generischen Typ auf der Klasse Q, also sollte es bekannt sein, dass es sich um Logging handelt und nicht um ILogging. Gibt es einen Weg dazu?

+0

wie die ursprüngliche Definition von Logging-Klasse kommt nicht mit dem Stichwort Teil markiert oder ist es nur weggelassen hier – TYY

+0

@TYY Bearbeitete es in –

+1

Ich weiß nicht, ob dies Ihr Problem lösen wird, aber zu einem bestimmten Zeitpunkt erinnere ich mich daran, Klasse zu der Einschränkung hinzuzufügen. Also ich hatte wo T-Klasse, ILogging – TYY

Antwort

2

Klingt wie ein C# -Compiler-Bug oder Defekt in Ausdrucksbäumen.

Wenn die Einschränkung ist where T : ILogging oder where T : struct, ILogging, ist der erzeugte Ausdruck {l => (Convert(l).ID == 1)}, das heißt einen gegossenes (man beachte die Convert), der wiederum enthält die notorische EF Ausnahme verursacht.

entfernt jedoch eine class Einschränkung setzt die Besetzung und EF ist einfach nur glücklich:

where T : class, ILogging Ergebnisse in {l => (l.ID == 1)}

+0

Die Klassenbeschränkung hat es getan –