【问题标题】:Calling functions in Linq To SQl .net 3.5在 Linq To SQl .net 3.5 中调用函数
【发布时间】:2011-05-14 07:20:20
【问题描述】:

伙计们 我怎样才能实现以下目标

var productslist=from p in productsTable
                 select new product{Id=p.Id,Tax=myfunctions.calculateTax(p.price)};

我尝试 google 并遇到了这个document。有没有其他方法可以在不使用第三方 dll 的情况下做到这一点

解决方案:将应用程序移至 .net 4.0(这实际上是支持并且应该可以工作)。 Nway我暂时坚持以下解决方案

【问题讨论】:

  • calculateTax 是您数据库中的存储过程/函数吗?
  • 没有。它在我的代码中是一个函数
  • 检查“文档”链接上方的链接。它有一个 dll 允许你在 Linq 查询中使用 .ToExpandable()
  • @lafama - 指处理Expression<...> 类型;您的 calculateTax 方法不是 Expression AFAIK。

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


【解决方案1】:

LINQ to SQL 不能神奇地将任意 C# 转换为 TSQL; LINQ 中提供了有限的选择常用语法,但 C# 方法不起作用。

选项:

  • 将函数重写为 UDF(在 TSQL 中)并将 UDF 映射到您的数据上下文(即将 UDF 拖到设计器表面);在 LINQ 中使用 myDataContext.MyUdf(args)
  • 仅在数据返回 .NET-land 后应用您的函数
  • 将函数重写为 LINQ 投影

我希望中间选项在您的场景中是最简单的。例如:

var productslist=
            (from p in productsTable
             select new {Id=p.Id,p.price}).AsEnumerable()
            .Select(p => new {p.Id, Tax=myfunctions.calculateTax(p.price)});

AsEnumerable() 打破了“组合”——即它阻止 LINQ-to-SQL 尝试根据 TSQL 理解 calculateTax;从 SQL 中只检索到 Idprice;然后在处理每一行时应用第二个投影来计算税收。

【讨论】:

    【解决方案2】:

    您是在尝试调用 本地 函数还是数据库中的函数?如果它是一个本地函数并且它是您要做的最后一件事,这很容易 - 您只需要调用 AsEnumerable() 来强制查询的其余部分在本地执行:

    var products = productsTable.AsEnumerable()
                                .Select(p => new Product
                                        { p.Id, Tax = CalculateTax(p.Price) });
    

    【讨论】:

    • 它是一个本地函数。请解释你的意思是“在本地执行的查询的主要部分”。我认为整个查询可以在数据库上执行
    • @lafama:如果您尝试执行本地代码,则不会。基本上我上面的版本将从数据库中提取数据并在每个返回的数据上调用CalculateTax。如果要在数据库中执行税收计算,则应编写存储过程或 UDF。
    • 我唯一要注意的是,这可能会获取不必要的列 - 但由于我们已经缺少 where,这似乎很挑剔;p
    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多