C# 在linq中使用自定义sql server函数?

C# 在linq中使用自定义sql server函数?,c#,sql-server,linq,C#,Sql Server,Linq,我在SQL Server中有一个表,它保存所有存储信息 栏目包括: storeId, locationLongitude, locationLatitude 以及一个sql函数getDistance,它接受以下参数(客户经度、客户纬度、商店经度、商店纬度) 我当前的sql查询是: SELECT TOP 5 dbo.[getDistance] (473.510432, -122.154381, locLatitude, locLongitude, 'Miles') AS distance

我在SQL Server中有一个表,它保存所有存储信息

栏目包括:

storeId, locationLongitude, locationLatitude
以及一个sql函数
getDistance
,它接受以下参数(客户经度、客户纬度、商店经度、商店纬度)

我当前的sql查询是:

SELECT TOP 5 
   dbo.[getDistance] (473.510432, -122.154381, locLatitude, locLongitude, 'Miles') AS distance, 
   loclatitude, loclongitude, storeId , 
FROM 
   storelocation WITH(NOLOCK)  
ORDER BY 
   distance; 
我目前正在缓存所有存储信息,然后运行linq来过滤数据。有没有办法在linq中调用
getDistance

您可以使用它将linq扩展到实体(EF 6.1),以便您的上下文支持表值函数

首先,您需要向上下文添加一个方法,如下所示;(将名称“MyContext”替换为上下文类型名称)

[DbFunction(“MyContext”、“getDistance”)]
[DbFunctionDetailsAttribute(ResultColumnName=“locationId”,DatabaseSchema=“dbo”)]
公共IQueryable getDistance(int locLatitude,int locLatitude)
{
返回F2(“getDistance”、“locLatitude”、“locLatitude”、“LocLength”、“LocLength”);
}
这将调用您还需要添加的实用程序函数

    private IQueryable<TResult> F2<TResult, TParam1, TParam2>(string functionName, string parameterName1,
        TParam1 parameterValue1, string parameterName2,
        TParam2 parameterValue2)
    {
        var queryString = string.Format("[{0}].[{1}](@{2}, @{3})", GetType().Name, functionName, parameterName1, parameterName2);
        var parameter1 = new ObjectParameter(parameterName1, parameterValue1);
        var parameter2 = new ObjectParameter(parameterName2, parameterValue2);
        var query = this.ObjectContext.CreateQuery<TResult>(queryString, parameter1, parameter2);
        return query;
    }
private IQueryable F2(字符串函数名、字符串参数名称1、,
TParam1参数值1,字符串参数值2,
TParam2参数值2)
{
var queryString=string.Format(“[{0}].[{1}](@{2},@{3})”,GetType().Name,functionName,parameterName1,parameterName2);
var parameter1=新的ObjectParameter(parameterName1,parameterValue1);
var parameter2=新对象参数(parameterName2,parameterValue2);
var query=this.ObjectContext.CreateQuery(queryString,参数1,参数2);
返回查询;
}
最后,在OnModelCreating中,注册函数返回的类型

        modelBuilder.ComplexType<StoreInfo>();
modelBuilder.ComplexType();
现在,您的上下文有一个IQueryable,您可以在Linq to实体中使用它

        modelBuilder.ComplexType<StoreInfo>();