Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using built-in sql functions in a LINQ query?

Tags:

c#

linq

t-sql

Is it possible to use buillt-in sql functions like user_name() in a LINQ query? If not, can I use something else?

like image 347
dce Avatar asked Mar 15 '26 02:03

dce


2 Answers

It depends on the provider. For example, in LINQ to Entities against SQL Server you can use SqlFunctions - which has a UserName method which corresponds to USER_NAME() in Transact-SQL. (There are many other methods and properties. For the current user, you can just use the CurrentUser property, for example.)

like image 70
Jon Skeet Avatar answered Mar 17 '26 16:03

Jon Skeet


EDIT

Extension to @jon Skeet answer

SqlFunctions Class - Provides common language runtime (CLR) methods that call functions in the database in LINQ to Entities queries.

How to use

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);
    }
}

For : SqlFunctions.UserName Method use SqlFunctions.UserName ()


Here is MSDN : How to: Call Custom Database Functions

  • Create a custom function in your database.
  • Declare a function in the store schema definition language (SSDL) of your .edmx file. The name of the function must be the same as the name of the function declared in the database.
  • Add a corresponding method to a class in your application code and apply a EdmFunctionAttribute to the method Note that the NamespaceName and FunctionName parameters of the attribute are the namespace name of the conceptual model and the function name in the conceptual model respectively. Function name resolution for LINQ is case sensitive.
  • Call the method in a LINQ to Entities query.

Added Custom function

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

In Linq query

var students = from s in context.People
                   where s.EnrollmentDate != null
                   select new
                   {
                       name = s.LastName,
                       avgGrade = AvgStudentGrade(s.PersonID)
                   };
like image 26
Pranay Rana Avatar answered Mar 17 '26 15:03

Pranay Rana



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!