在linq中使用自定义sql server功能?

时间:2014-08-23 18:34:40

标签: c# sql-server linq

我在SQL Server中有一个表,其中包含所有商店信息。

列是:

storeId, locationLongitude, locationLatitude

和一个sql函数getDistance,它带有参数(Customer Longitude,Customer Latitude,store Longitude,store latitude)

我当前的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

1 个答案:

答案 0 :(得分:1)

您可以使用this package扩展Linq-to-Entities(EF 6.1),以便您的上下文支持表值函数。

首先,您需要为您的上下文添加一个方法,就像这样; (为您的上下文类型名称交换名称“MyContext”)

    [DbFunction("MyContext", "getDistance")]
    [DbFunctionDetailsAttribute(ResultColumnName = "locationId", DatabaseSchema = "dbo")]
    public IQueryable<StoreInfo> getDistance(int locLatitude, int locLongitude)
    {
        return F2<StoreInfo, int, int>("getDistance", "locLatitude", locLatitude, "locLongitude", locLongitude);
    }

这会调用您还需要添加的实用程序功能;

    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;
    }

最后,在OnModelCreating中,注册函数返回的类型;

        modelBuilder.ComplexType<StoreInfo>();

现在您的上下文具有IQueryable,您可以在Linq-to-entities中使用它。