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

时间:2013-09-19 17:12:22

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

我有一段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(并且超出了我的特定需求),但是让我的查询看起来很难看。有什么方法可以让这个更简洁吗?也许是一种返回表达式>的扩展方法。 ?请注意,我不想将数据提取到客户端(在服务器上以SQL运行),这使事情变得更复杂一些。例如:

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

我尝试编写一个执行此操作的扩展方法,但提供程序只是忽略该调用或抛出异常,表明它不知道如何将该调用转换为SQL。我们可以以某种方式扩展SQL生成器来为我们执行此操作,或者以一种生成相同SQL的方式提供它吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:-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)