3

是否可以在 LINQ 查询中使用像 user_name() 这样的内置 sql 函数?如果没有,我可以用别的东西吗?

4

2 回答 2

7

这取决于提供者。例如,在针对 SQL Server 的 LINQ to Entities 中,您可以使用SqlFunctions- 它具有UserName对应USER_NAME()于 Transact-SQL 中的方法。(还有很多其他的方法和属性,对于当前用户,你可以只使用CurrentUser属性,例如。)

于 2012-07-26T06:22:21.173 回答
4

编辑

扩展到@jon Skeet 答案

SqlFunctions 类- 提供公共语言运行时 (CLR) 方法,这些方法在 LINQ to Entities 查询中调用数据库中的函数。

如何使用

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 方法 使用SqlFunctions.UserName ()


这是 MSDN: 如何:调用自定义数据库函数

  • 在您的数据库中创建一个自定义函数。
  • 在 .edmx 文件的存储架构定义语言 (SSDL) 中声明一个函数。函数名必须与数据库中声明的函数名相同。
  • 在应用程序代码中为类添加对应的方法并将 EdmFunctionAttribute 应用到方法注意,属性的 NamespaceName 和 FunctionName 参数分别是概念模型的命名空间名称和概念模型中的函数名称。LINQ 的函数名称解析区分大小写。
  • 在 LINQ to Entities 查询中调用该方法。

添加自定义功能

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

在 Linq 查询中

var students = from s in context.People
                   where s.EnrollmentDate != null
                   select new
                   {
                       name = s.LastName,
                       avgGrade = AvgStudentGrade(s.PersonID)
                   };
于 2012-07-26T06:22:41.027 回答