【问题标题】:Custom extension method to simplify LINQ to SQL statement简化 LINQ to SQL 语句的自定义扩展方法
【发布时间】:2013-09-24 21:53:55
【问题描述】:

我有一个 LINQ 代码的 sn-p,我需要在很多查询中使用它

let catchmentId = Convert.ToInt32(
        phy.PhysicalProperty_binData.Substring(offset + 3, 1) +
        phy.PhysicalProperty_binData.Substring(offset + 2, 1) +
        phy.PhysicalProperty_binData.Substring(offset + 1, 1) +
        phy.PhysicalProperty_binData.Substring(offset, 1))

这可以很好地转换为 SQL(并且对于我的特定需求来说性能更高),但是让我的查询看起来很难看。有什么办法可以让这不那么冗长吗?也许是返回 Expression> 的扩展方法?请注意,我不想将数据提取到客户端(在服务器上作为 SQL 运行),这使事情变得更加复杂。例如:

let catchmentId = phy.PhysicalProperty_binData.AnExtensionMethodHere<int>(offset)

我尝试编写一个扩展方法来执行此操作,但提供程序只是忽略了该调用或引发异常,说明它不知道如何将该调用转换为 SQL。我们能否以某种方式扩展 SQL 生成器来为我们执行此操作,或者以某种方式为其提供能够生成相同 SQL 的东西?

提前致谢!

【问题讨论】:

    标签: c# sql linq linq-to-sql


    【解决方案1】:

    this page 上的链接将向您展示如何使用自定义属性将扩展方法与数据库中的用户定义函数联系起来。

    当然,这意味着您需要在 SQL 中创建一个用户定义的函数来执行您的扩展方法想要执行的相同逻辑。

    另一种选择是让您的扩展方法生成一个Expression,并使用LINQKit 解析查询树,从该表达式中找到对.Compile() 的调用,并将该表达式内联到查询中。

    【讨论】:

    • 既然 LINQ to SQL 生成器已经了解我需要使用的所有方法,有没有办法在没有 SQL(或 SQL CLR)函数的情况下这样做?
    • @ananthonline:是的,请参阅我的更新。这需要更多的工作,但 LINQKit 可以完成大部分繁重的工作。
    • 完美。我现在已经使用了用户定义的函数路线,但会进一步研究 AsExpandable。
    【解决方案2】:

    您可以在实体模型中映射自定义 SQL 函数。

    http://msdn.microsoft.com/en-us/library/dd456812(v=vs.103).aspx

    【讨论】:

    • 我的错,我错误地添加了EF4标签。我有一个 dbml 文件(LINQ-to-objects),而不是该方法所需的 edmx 文件。
    【解决方案3】:

    如果人们需要的话,这里的语言有误(抱歉),这里是 F#。

    let catchmentId =  
        // Curry in invariant components.
        let newSubstr end = 
            phy.PhysicalProperty_binData.Substring(offset + end, 1)
        Convert.ToInt32(
            newSubstr 3 +
            newSubstr 2 + 
            newSubstr 1 +
            newSubstr 0)
    

    【讨论】:

    • 那是 C# 吗?你可能在想 F#。这是一个“let”,是更大的 C# LINQ 语句的一部分。
    • 抱歉,我看到 let 并假设 F#
    • 您的大部分冗长都来自在您的示例中调用 PhysicalProperty。您可能只需要创建一个别名就可以节省许多字符:var physProp = phy.PhysicalProperty_binData;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多