Sto cercando di aggiungere la funzione sql-server DATEPART a Entity Framework Core aggiungendola come metodo statico su DbContext con l'attributo [DbFunction] come descritto qui https://docs.microsoft.com/en-us/ef/core /what-is-new/ef-core-2.0
Il problema è che sql-server riceve il parametro datepart come stringa e non può eseguirlo perché il parametro datepart non può essere una stringa (basato su https://docs.microsoft.com/en-us/sql/t- sql / Functions / datepart-transact-sql? view = sql-server-2017 "Nota DATEPART non accetta equivalenti variabili definiti dall'utente per gli argomenti datepart.")
ho anche provato a rimuovere le doppie virgolette dall'argomento che passo a datepart, facendo sting.Replace ("\" "," ") ma non funziona ancora (cambia l'argomento da" 'arg' "a 'arg ')
Ecco il mio codice:
[DbFunction("DATEPART","")]
public static int DATEPART(string datepart, DateTime date)
{
throw new NotSupportedException();
}
C'è qualche altro tipo di dati che funzionerà? mi sto perdendo qualcosa?
Grazie
È possibile utilizzare la funzione SQL datepart avvolgendola con DbFunctionAttribute. La parte complicata è dire a ef core di non gestire il parametro del tipo datepart come una stringa. Esempio:
DbContext:
public int? DatePart(string datePartArg, DateTime? date) => throw new Exception();
public void OnModelCreating(DbModelBuilder modelBuilder) {
var methodInfo = typeof(DbContext).GetRuntimeMethod(nameof(DatePart), new[] { typeof(string), typeof(DateTime) });
modelBuilder
.HasDbFunction(methodInfo)
.HasTranslation(args => new SqlFunctionExpression(nameof(DatePart), typeof(int?), new[]
{
new SqlFragmentExpression(args.ToArray()[0].ToString()),
args.ToArray()[1]
}));
}
Query:
repository.Where(x => dbContext.DatePart("weekday", x.CreatedAt) == DayOfWeek.Monday);
qualche informazione in più: https://github.com/aspnet/EntityFrameworkCore/issues/10404