LINQ to SQL:无法在LINQ查询中使用SQL Server UDF

时间:2016-06-14 14:09:55

标签: c# .net sql-server linq linq-to-sql

我正在做LINQ to Sql。为了获得良好的性能,我试图在SQL Server端本身过滤一些记录。所以我想使用我的数据库中可用的用户定义函数(UDF)GiveWordCount。根据{{​​3}}帖子,我在C#端尝试使用该UDF。

声明一个虚函数体,以便C#代码可以编译:

[Function(Name = "dbo.GiveWordCount", IsComposable = true)]
public static int GiveWordCount([Parameter(Name="@inputValue",DbType="nvarchar(4000)")]string inputValue)
    {
        throw new NotSupportedException("Direct calls are not supported.");
    }

然后我在LINQ查询中调用此函数,如下所示。致电' GiveWordCount'在最终的SQL查询被触发到数据库之前,函数应该由LINQ转换为Sql提供程序转换为等效的内置sql server函数。相反,它会导致错误:

  

方法' Int32 GiveWordCount(System.String)'没有支持   转换为SQL。

这是我的主要功能:

static void Main(string[] args)         
{
    DataContext dataContext = new DataContext("data source=.;initial catalog=businessLinqToSql;integrated security=True;MultipleActiveResultSets=True");

    Table<Customer> customers = dataContext.GetTable<Customer>();
    IEnumerable<string> b = customers.Where(customer => GiveWordCount(customer.Name) <= 2).Select(x => x.Name);


    foreach (string element in b) Console.WriteLine(element);
}

这是我的客户类:

 [Table]
    public class Customer
    {
        [Column]
        public string Name { get; set; }
    }

1 个答案:

答案 0 :(得分:0)

我认为该方法需要在具有与现有Linq to Sql DataContext相同的Namespace和Class名称的部分类中。如果右键单击dbml文件datacontext.dbml =&gt; View Code,它将为您生成空的分段课程。

E.g。将映射添加到ISNUMERIC SQL函数

using System.Data.Linq.Mapping;
namespace SameNamespaceAsDataContext
{
    partial class SameClassnameAsDataContext
    {
        [Function(Name = "ISNUMERIC", IsComposable = true)]
        public int IsNumeric(string input)
        {
            throw new NotImplementedException(); // this won't get called
        }
    }
}

然后按如下方式调用该方法:

IQueryable<int> results = MyDataContext.Table.Select(x => IsNumeric(x.Column));