Utilisation de fonctions SQL intégrées dans une requête LINQ?

Est-il possible d’utiliser des fonctions sql de buillt-in comme user_name () dans une requête LINQ? Si non, puis-je utiliser autre chose?

Cela dépend du fournisseur. Par exemple, dans LINQ to Entities contre SQL Server, vous pouvez utiliser SqlFunctions , qui possède une méthode UserName qui correspond à USER_NAME() dans Transact-SQL. (Il existe de nombreuses autres méthodes et propriétés. Pour l’utilisateur actuel, vous pouvez simplement utiliser la propriété CurrentUser , par exemple.)

MODIFIER

Extension à @jon Skeet answer

SqlFunctions Class – Fournit des méthodes CLR (common language runtime) appelant des fonctions dans la firebase database dans les requêtes LINQ to Entities.

Comment utiliser

 using (AdventureWorksEntities AWEntities = new AdventureWorksEntities()) { // SqlFunctions.CharIndex is executed in the database. var contacts = from c in AWEntities.Contacts where SqlFunctions.CharIndex("Si", c.LastName) == 1 select c; foreach (var contact in contacts) { Console.WriteLine(contact.LastName); } } 

Pour: méthode SqlFunctions.UserName, utilisez SqlFunctions.UserName ()


Voici MSDN: Comment: appeler des fonctions de firebase database personnalisées

  • Créez une fonction personnalisée dans votre firebase database.
  • Déclarez une fonction dans le langage de définition de schéma de magasin (SSDL) de votre fichier .edmx. Le nom de la fonction doit être identique à celui de la fonction déclarée dans la firebase database.
  • Ajoutez une méthode correspondante à une classe dans votre code d’application et appliquez un EdmFunctionAtsortingbute à la méthode. Notez que les parameters NamespaceName et FunctionName de l’atsortingbut sont respectivement le nom de l’espace de nom du modèle conceptuel et le nom de la fonction. La résolution du nom de fonction pour LINQ est sensible à la casse.
  • Appelez la méthode dans une requête LINQ to Entities.

Fonction personnalisée ajoutée

 [EdmFunction("SchoolModel.Store", "AvgStudentGrade")] public static decimal? AvgStudentGrade(int studentId) { throw new NotSupportedException("Direct calls are not supported."); } 

Dans la requête Linq

 var students = from s in context.People where s.EnrollmentDate != null select new { name = s.LastName, avgGrade = AvgStudentGrade(s.PersonID) };