Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简化LINQ到SQL语句的自定义扩展方法_C#_Sql_Linq_Linq To Sql - Fatal编程技术网

C# 简化LINQ到SQL语句的自定义扩展方法

C# 简化LINQ到SQL语句的自定义扩展方法,c#,sql,linq,linq-to-sql,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) +

我有一段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)
let catchmentId=phy.PhysicalProperty\u binData.AnExtensionMethodHere(偏移量)
我尝试编写一个扩展方法来实现这一点,但提供程序只是忽略该调用,或者抛出一个异常,说明它不知道如何将该调用转换为SQL。我们是否可以通过某种方式扩展SQL生成器来为我们实现这一点,或者以生成相同SQL的方式为它提供一些东西


提前谢谢

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


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

错误的语言(对不起)如果人们需要的话,这里是F#。 错误的语言(对不起)这里是F#如果人们需要的话。 上的链接将向您展示如何使用自定义属性将扩展方法绑定到数据库中的用户定义函数

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

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

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

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


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

我的错,我错误地添加了EF4标记。我有一个dbml文件(LINQ to objects),而不是该方法所需的edmx文件。我有一个dbml文件(LINQ to objects),而不是该方法所需的edmx文件。这是C#吗?你可能在想F#。这是一个“let”,是一个更大的C#LINQ语句的一部分。很抱歉,我看到了let,并假设F#您的大部分冗长都是因为在示例中调用了PhysicalProperty。只需创建一个别名,就可以保存许多字符:var physProp=phy.PhysicalProperty\u binData;是C#吗?你可能在想F#。这是一个“let”,是一个更大的C#LINQ语句的一部分。很抱歉,我看到了let,并假设F#您的大部分冗长都是因为在示例中调用了PhysicalProperty。只需创建一个别名,就可以保存许多字符:var physProp=phy.PhysicalProperty\u binData;既然LINQ to SQL生成器已经理解了我需要使用的所有方法,那么有没有一种不用SQL(或SQL CLR)函数的方法可以做到这一点?@ananthonline:是的,请参阅我的更新。这需要更多的工作,但是LINQKit可以做大部分的重物。太好了。我现在已经使用了用户定义的函数路径,但将进一步研究可扩展的函数。由于LINQ到SQL生成器已经理解了我需要使用的所有方法,有没有一种方法可以在没有SQL(或SQL CLR)函数的情况下做到这一点?@ananthonline:是的,请参阅我的更新。这需要更多的工作,但是LINQKit可以做大部分的重物。太好了。我现在已经使用了用户定义的函数路线,但将进一步研究可扩展性。
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)