2010-04-08 3 views
5

Ich habe ein entityDao, das von jedem meiner objectDaos übernommen wird. Ich benutze Dynamic Linq und versuche generische Abfragen zu erhalten.Dynamische Linq Hilfe, verschiedene Fehler abhängig von Objekt übergeben als Parameter?

Ich habe den folgenden Code in meiner generische Methode in meinem EntityDao:

public abstract class EntityDao<ImplementationType> where ImplementationType : Entity 
{ 
    public ImplementationType getOneByValueOfProperty(string getProperty, object getValue){ 
    ImplementationType entity = null; 
    if (getProperty != null && getValue != null) 
    { 
     LCFDataContext lcfdatacontext = new LCFDataContext(); 
     //Generic LINQ Query Here 
     entity = lcfdatacontext.GetTable<ImplementationType>().Where(getProperty + " [email protected]", getValue).FirstOrDefault(); 
     //.Where(getProperty & "==" & CStr(getValue)) 
    } 

//lcfdatacontext.SubmitChanges() 
//lcfdatacontext.Dispose() 

return entity; 
} 

Dann habe ich die folgende Methodenaufruf in einem Gerät zu testen Sie (Alle meine objectDaos erben entityDao):

[Test] 
public void getOneByValueOfProperty() 
{ 
    Accomplishment result = accomplishmentDao.getOneByValueOfProperty 
     ("AccomplishmentType.Name", "Publication"); 

    Assert.IsNotNull(result); 
} 

Die obigen Durchgänge (AccomplishmentType hat eine Beziehung zur Erfüllung)

Accomplishment result = accomplishmentDao.getOneByValueOfProperty("Description", "Can you hear me now?"); 
Accomplishment result = accomplishmentDao.getOneByValueOfProperty("LocalId", 4); 

Beide der oben genannten Arbeiten. Allerdings ist

Accomplishment result = accomplishmentDao.getOneByValueOfProperty 
    ("Id", New Guid("95457751-97d9-44b5-8f80-59fc2d170a4c")); 

nicht und sagt der folgende:

Operator '=' incompatible with operand types 'Guid' and 'Guid 

Warum ist das passiert? Guid's kann nicht verglichen werden? Ich habe versucht == als auch aber gleichen Fehler. Was ist sogar noch mehr verwirrend ist, dass jedes Beispiel für dynamische Linq ich einfach Strings usings gesehen haben, ob die parametrisierte mit dem Prädikat oder dieses kommentierte ich habe aus:

//.Where(getProperty & "==" & CStr(getValue)) 

Mit oder ohne Cstr, viele Datentypen nicht funktionieren mit diesem Format. Ich habe versucht, den getValue auf eine Zeichenkette anstatt auf ein Objekt zu setzen, aber dann bekomme ich nur andere Fehler (wie eine Multiword-Zeichenkette würde den Vergleich nach dem ersten Wort stoppen).

Was fehlt mir, damit dies mit GUIDs und/oder einem beliebigen Datentyp funktioniert? Im Idealfall würde ich gerne eine Zeichenfolge für getValue (wie ich für jedes andere dynamische LINQ-Beispiel gesehen habe) anstelle des Objekts übergeben und sie unabhängig vom Datentyp der Spalte ausführen lassen.

Antwort

6

Welp Ich habe das herausgefunden, Dynamic LINQ unterstützt anfänglich keinen Vergleich von GUIDs (so dumm!). Ich fand diese kleinen Leckerbissen: https://connect.microsoft.com/VisualStudio/feedback/details/333262/system-linq-dynamic-throws-an-error-when-using-guid-equality-in-where-clause

Sie gehen nur in einem Bearbeitungs Dynamics.cs, ersetzen Sie die IEqualitySignatures Schnittstelle mit den folgenden:

interface IEqualitySignatures : IRelationalSignatures 
{ 
    void F(bool x, bool y); 
    void F(bool? x, bool? y); 
    void F(Guid x, Guid y); 
    void F(Guid? x, Guid? y); 
} 

Nun meine getOneByValueOfProperty arbeitet die ganze Zeit!

0

für Guid dies sollte funktionieren:

.Where(getProperty + ".Equals(@0)", getValue); 

(sollte der Parameter beachten getValue Typ sein Guid)