【问题标题】:Using built-in sql functions in a LINQ query?在 LINQ 查询中使用内置的 sql 函数?
【发布时间】:2012-07-24 16:46:15
【问题描述】:

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

【问题讨论】:

    标签: c# linq tsql


    【解决方案1】:

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

    【讨论】:

    • 我遇到了错误。这是我的代码 sn-p - DataContext dataContext = new DataContext("conn string"); Table<Customer> customers = dataContext.GetTable<Customer>(); var b = from c in customers where SqlFunctions.CharIndex("r", c.Name) == 0 select c.Name; var v = b.ToString(); 这导致最后一行出现以下错误 - Method 'System.Nullable``1[System.Int32] CharIndex(System.String, System.String)' has no supported translation to SQL.
    • @RBT:这看起来与这个问题无关,应该在单独的帖子中提出。
    • 感谢乔恩的好意建议。我已将其作为一个新问题发布在这里:stackoverflow.com/questions/37814449/…
    • @RBT SqlFunctions 方法不适用于 Linq to Sql 查询。 Linq to Sql 不知道这些方法如何映射到 SQL 函数,这就是它抛出异常的原因。
    【解决方案2】:

    编辑

    @jon Skeet 答案的扩展

    SqlFunctions Class - 提供公共语言运行时 (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);
        }
    }
    

    对于:SqlFunctions.UserName Method 使用SqlFunctions.UserName ()


    这里是 MSDN: How to: Call Custom Database Functions

    • 在您的数据库中创建自定义函数。
    • 在 .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)
                       };
    

    【讨论】:

    • 我正在使用DataContext 类做一个简单的 linq to sql。这种方法不涉及任何 EDMX 文件。我将如何使用您的方法来调用我的用户定义的 sql server 函数?
    猜你喜欢
    • 1970-01-01
    • 2013-12-06
    • 2012-01-29
    • 2021-11-23
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多