【问题标题】:Custom Method in LINQ to SQL queryLINQ to SQL 查询中的自定义方法
【发布时间】:2010-09-03 11:50:53
【问题描述】:

是否可以在查询中使用自定义方法例如:

var result = from u in context.MyTable where MyMethod(u) == 10 select u;

【问题讨论】:

  • 你尝试这样做时发生了什么?
  • 你试过了吗?还是这只是一个常识性问题?
  • 您的意思是 LINQ to XML、LINQ to SQL、LINQ to SomethingWeveNeverHeardOf?
  • 它的linq to sql,错误是它不知道该方法的sql
  • @snorlaks:谢谢,现在您知道“LINQ”并不意味着 LINQ to SQL。

标签: c# linq linq-to-sql


【解决方案1】:

正如 Pranay 解释的那样,您不能将自定义 (C#) 方法作为 LINQ to SQL 查询的一部分,因为 LINQ to SQL 无法查看该方法的表达式树,因此无法将其转换为SQL。

您有一个选择是在 SQL 中编写函数并将其作为 SQL 函数存储在 SQL Server 上(您也可以使用 SQL CLR,但我没有尝试过)。然后,您可以将该函数添加到您的 DataContext 类型中,LINQ to SQL 会将其转换为对 SQL 服务器上函数的调用。比如:

var result = from u in context.MyTable 
             where context.MyMethod(u) == 10 select u; 

当然,问题是您需要用 SQL 编写函数(我认为 SQL CLR 也可以工作 - 但不确定性能和其他可能的复杂情况)

我还 wrote an article(前段时间)展示了当您将“方法”编写为表达式树方式(作为 Expression<Func<...>> 类型的值)时如何执行此操作,这是可能的,因为在这种情况下,代码被编译为表达式树。但是,必须完成一些后处理,您仍然可以只编写一个表达式,可以轻松地在 LINQ 查询中内联。

【讨论】:

  • 嗨,Thomas,您对这篇文章有什么更新吗?我正在处理遗留代码,需要能够在旧的基于 Linq to Sql 的项目上生成查找查询。我读了这篇文章,并用可扩展扩展撞了砖墙,因为这已经有几年历史了。任何帮助将不胜感激! :)
【解决方案2】:

查看全文:What is and what isn't possible with linq

以下是不可能的

// function used in filter
static bool MyFunc(Nwind.Product p)
{
  return p.ProductName.StartsWith("B");
}
// query that uses MyFunc
var q = 
  from p in db.Products
  where MyPriceFunc(p.UnitPrice) > 30m
  select p

它编译时没有错误,但是当您执行它时,LINQ to SQL 会抛出一个异常,提示:“静态方法 System.Boolean MyTest(LINQTest.Nwind.Product) 没有支持的 SQL 转换。”

当您尝试从 q 获取结果时(例如使用 foreach 语句)实际上会引发异常,因为 LINQ to SQL 仅在需要结果并且查询必须是执行。

要修复该示例,您只需将检查产品名称是否以“B”开头的代码复制到查询的 where 子句即可正常工作。

【讨论】:

    【解决方案3】:

    是的,但是如果您使用的是 Linq-to-Sql - 您的方法必须有特殊的代码来处理到 SQL 的转换。

    【讨论】:

    • 你能给我举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多