flindeberg ist korrekt, wenn er sagt, dass System.Linq.Dynamic den Ausdruck analysiert, den Sie als C# geben, nicht als SQL.
Entity Framework definiert jedoch die Klasse "DbFunctions", mit der Sie sql-Funktionen als Teil Ihrer Linq-Abfragen aufrufen können.
DbFunctions.DiffDays ist die Methode, die Sie suchen. Damit müssen Sie auch System.Linq.Dynamic nicht verwenden.
Ihr Code wie folgt aussehen würde, denke ich:
var _list = new vsk_error_log();
using (var entities = new vskdbEntities())
{
_list = entities.vsk_error_log
.Where(entry => DbFunctions.DiffDays(entry.added_date, DateTime.UtcNow) == 0)
.ToList();
}
return _list;
Wenn Sie diese Funktion mit System.Linq verwenden möchten.Dynamisch würde es in etwa so aussehen:
var _list = new vsk_error_log();
using (var entities = new vskdbEntities())
{
_list = entities.vsk_error_log
.Where("DbFunctions.DiffDays(added_date, DateTime.UtcNow) == 0")
.ToList();
}
return _list;
JEDOCH! System.Linq.Dynamic erkennt die Klasse DbFunctions nicht und funktioniert daher nicht ohne weiteres. Allerdings haben wir diese Funktionalität „Patch“ kann ein wenig Reflexion in Verwendung, obwohl es hässlich ein wenig sein kann:
var type = typeof(DynamicQueryable).Assembly.GetType("System.Linq.Dynamic.ExpressionParser");
FieldInfo field = type.GetField("predefinedTypes", BindingFlags.Static | BindingFlags.NonPublic);
Type[] predefinedTypes = (Type[])field.GetValue(null);
Array.Resize(ref predefinedTypes, predefinedTypes.Length + 1);
predefinedTypes[ predefinedTypes.Length - 1 ] = typeof(DbFunctions);
field.SetValue(null, predefinedTypes);
Durch diesen Code ausgeführt wird, wird System.Linq.Dynamic jetzt DbFunctions als eine Art erkennen, das kann in den analysierten C# -Ausdrücken verwendet werden.
Keine Eigenschaft oder ein Feld 'TAG' in Art existiert 'vsk_error_log' ... –
Warum führen Sie SQL-Code für .NET-Objekte aus? –
sollten Sie schließen) '" DateDiff (DAY, added_date, getdate()) = 0 "' –