繁体   English   中英

自定义扩展方法可简化LINQ to SQL语句

[英]Custom extension method to simplify LINQ to SQL statement

我有很多查询需要使用的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?

提前致谢!

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

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

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

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

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

错误的语言(抱歉),如果有人需要,它使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM