我有一个标量函数,可以获得两点之间的距离,我想用它来查询最接近的记录点.标量函数与linq一起使用到sql但是在EF中失败
标量函数
USE [GeoData]
GO
/****** Object: UserDefinedFunction [dbo].[DistanceBetween] Script Date: 09/18/2012 19:40:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[DistanceBetween](@Lat1 as real,
@Long1 as real, @Lat2 as real, @Long2 as real)
RETURNS real
AS
BEGIN
DECLARE @dLat1InRad as float(53);
SET @dLat1InRad = @Lat1;
DECLARE @dLong1InRad as float(53);
SET @dLong1InRad = @Long1;
DECLARE @dLat2InRad as float(53);
SET @dLat2InRad = @Lat2;
DECLARE @dLong2InRad as float(53);
SET @dLong2InRad = @Long2 ;
DECLARE @dLongitude as …Run Code Online (Sandbox Code Playgroud) 有没有办法可以将自定义标量数据库函数称为LINQ to Entities查询的一部分?我在网上唯一能找到的就是这个页面:
但是,此处给出的说明似乎假设您使用的是DB-first方法并讨论修改.edmx文件.如果您使用代码优先方法呢?我希望能够写出这样的东西:
var result = await (
from itm in _itemDataContext.Items
where
itm.QryGroup1 == "Y" &&
_itemDataContext.Dbo_MyCustomScalarIntFn(itm.QryGroup2) > 0
).ToArrayAsync();
Run Code Online (Sandbox Code Playgroud) 这里讨论模型定义的函数:
EF6.1.2 支持这些吗?
我正在逐步完成 Edm/DbModel 的内容,但我一生都无法弄清楚 csdl 中的 <Function> 元素应该在哪里进行解析,因为它没有将其放入 EdmModel (EdmModel.AddItem( EdmFunction) 没有被调用)
ExpressionConverter.FindFunction 在 EdmModel._functions 中查找,并且 _functions 仅由 EdmModel.AddItem(EdmFunction) 添加,并且仅由扩展方法 EdmModelExtensions.AddFunction() 调用,并且我在 EntityFramework 源代码中找不到调用该函数的任何位置。我一定错过了一些简单的东西......
更多:我放弃了在 edmx 中定义函数,现在我以编程方式创建 EdmFunction 并将其添加到自定义 IConceptualModelConvention.Apply() 方法中:
class CustomFunctionConvention : IConceptualModelConvention<EdmModel>
{
public void Apply(EdmModel item, DbModel model)
{
var functionPayload = new EdmFunctionPayload () {
CommandText = "CAST (strValue AS int)",
Parameters = new [] {
FunctionParameter.Create("strValue", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String).GetEdmPrimitiveType(), ParameterMode.In),
},
ReturnParameters = new [] { …Run Code Online (Sandbox Code Playgroud)