1

我有一段 LINQ 代码需要在很多查询中使用

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 的东西?

提前致谢!

4

3 回答 3

1

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

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

于 2013-09-19T17:20:36.260 回答
1

此页面上的链接将向您展示如何使用自定义属性将扩展方法绑定到数据库中的用户定义函数。

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

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

于 2013-09-19T17:46:43.123 回答
-1

错误的语言(对不起)如果人们需要,它在 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)
于 2013-09-19T17:26:58.033 回答