In meinem vereinfachten Beispiel habe ich ein Objekt mit folgenden Eigenschaften:
Ich muss in der Lage sein, dynamische Abfragen auf folgende Weise zu erstellen
var predicate = "Name = @0";
var values = new object[]{"Ed"};
myIQueryableDataSource.Where(predicate, values)
Das funktioniert gut. Jetzt möchte ich meine datetime vergleichen
var predicate = "BirthDateTimeStamp >= @0";
var values = new object[]{someDateTime};
Das funktioniert auch gut. Aber was ich eigentlich tun möchte, wenn ich die Datenzeiten vergleiche, und dieses Problem zeigt sich besser, wenn ich die Gleichheit mache, ist nur das Vergleichen am Datum.
var predicate = "BirthDateTimeStamp.Date >= @0";
Dies ist nicht möglich, da die Date-Eigenschaft von EF to SQL Server nicht erkannt wird
var predicate = "System.Data.Entity.DbFunctions.TruncateTime(BirthDateTimeStamp) >= @0";
Dies funktioniert auch nicht, da ich nur im Prädikat auf meine Objekteigenschaften zugreifen kann.
Wie kann ich das auf diese Weise lösen, damit das Prädikat im Zeichenfolgenformat bleibt? Dieser Code ist nur ein Teil eines großen vorhandenen Parsers für meine Abfragen und wird vollständig neu geschrieben.
Die Antwort von @RockResolve hat funktioniert, ist aber ein Hack. Linq Dynamics bietet Funktionen zum Hinzufügen benutzerdefinierter Funktionen
public class CustomTypeProvider: IDynamicLinkCustomTypeProvider
{
public HashSet<Type> GetCustomTypes()
{
HashSet<Type> types = new HashSet<Type>();
// adding custom types
types.Add(typeof(DbFunctions));
return types;
}
}
// use below line to add this to linq
System.Linq.Dynamics.GlobalConfig.CustomTypeProvider = new CustomTypeProvier();