Asp.net 将我的EdmXXML与Nerd晚餐中的原始XML进行比较,我发现我的XML已经将函数之间距离的所有类型都更改为“real”,而Nerd晚餐中有“float”。将它们改回float解决了问题。因此您有一个名为DistanceBetween()的SQL Ser

Asp.net 将我的EdmXXML与Nerd晚餐中的原始XML进行比较,我发现我的XML已经将函数之间距离的所有类型都更改为“real”,而Nerd晚餐中有“float”。将它们改回float解决了问题。因此您有一个名为DistanceBetween()的SQL Ser,asp.net,sql,entity-framework,nerddinner,Asp.net,Sql,Entity Framework,Nerddinner,将我的EdmXXML与Nerd晚餐中的原始XML进行比较,我发现我的XML已经将函数之间距离的所有类型都更改为“real”,而Nerd晚餐中有“float”。将它们改回float解决了问题。因此您有一个名为DistanceBetween()的SQL Server UDF?你能发布它吗?@p.campbell我已经编辑了我的帖子并包含了UDF。所以你有一个SQL Server UDF,名为DistanceBetween()?你能发布它吗?@p.campbell我已经编辑了我的帖子并加入了自定义项。


将我的EdmXXML与Nerd晚餐中的原始XML进行比较,我发现我的XML已经将函数之间距离的所有类型都更改为“real”,而Nerd晚餐中有“float”。将它们改回float解决了问题。

因此您有一个名为
DistanceBetween()
的SQL Server UDF?你能发布它吗?@p.campbell我已经编辑了我的帖子并包含了UDF。所以你有一个SQL Server UDF,名为
DistanceBetween()
?你能发布它吗?@p.campbell我已经编辑了我的帖子并加入了自定义项。哦-好吧-在我写这篇文章的时候,你用一个SQL自定义项而不是c#函数来更新你的帖子,所以忽略我:-)但是,如果你选择进行简单的查询并将DistanceBetween移动到c#这仍然有效!我尝试了,它返回了DistanceBetween函数中的异常。看起来实体框架无法与SQL UDFI匹配。我认为POCO模板和数据库功能之间可能存在一些缺陷……我认为唯一的办法是用C重写这些代码——哦,好吧——在我写这篇文章时,你用SQL UDF而不是C函数更新你的文章,所以请忽略我:-)然而,如果您选择进行简单查询并将DistanceBetween移动到c#这仍然有效!我尝试了,它返回了DistanceBetween函数中的异常。实体框架似乎无法与SQL UDFI匹配。我认为POCO模板和数据库功能之间可能存在一些缺陷……我认为唯一的办法是用C#重写这些代码。看起来您直接使用SQL查询,而不是使用函数。基本上。因为POCO中没有EDM映射,所以我提出了一种方法,通过直接调用sql server上的函数来利用它。我希望他们在下一个版本中能够解决这一问题。它看起来像是直接使用sql查询,而不是使用函数。基本上。因为POCO中没有EDM映射,所以我提出了一种方法,通过直接调用sql server上的函数,仍然可以利用它。我希望他们在下一个版本中会解决这个问题
    public IQueryable<AllAirports> ReturnAllAirportWithIn50milesOfAPoint(double lat, double lon)
    {
        var airports = from d in im.AllAirports
               where DistanceBetween(lat, lon, (double)d.Lat, (double)d.Lon) < 1000.00
               select d;
        return airports;
    }

    [EdmFunction("AirTravelModel.Store", "DistanceBetween")]
    public static double DistanceBetween(double lat1, double long1, double lat2, double long2)
    {
        throw new NotImplementedException("Only call through LINQ expression");
    }
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 * (PI()/180.0); DECLARE @dLong1InRad as float(53); SET @dLong1InRad = @Long1 * (PI()/180.0); DECLARE @dLat2InRad as float(53); SET @dLat2InRad = @Lat2 * (PI()/180.0); DECLARE @dLong2InRad as float(53); SET @dLong2InRad = @Long2 * (PI()/180.0); DECLARE @dLongitude as float(53); SET @dLongitude = @dLong2InRad - @dLong1InRad; DECLARE @dLatitude as float(53); SET @dLatitude = @dLat2InRad - @dLat1InRad; /* Intermediate result a. */ DECLARE @a as float(53); SET @a = SQUARE (SIN (@dLatitude / 2.0)) + COS (@dLat1InRad) * COS (@dLat2InRad) * SQUARE(SIN (@dLongitude / 2.0)); /* Intermediate result c (great circle distance in Radians). */ DECLARE @c as real; SET @c = 2.0 * ATN2 (SQRT (@a), SQRT (1.0 - @a)); DECLARE @kEarthRadius as real; /* SET kEarthRadius = 3956.0 miles */ SET @kEarthRadius = 6376.5; /* kms */ DECLARE @dDistance as real; SET @dDistance = @kEarthRadius * @c; return (@dDistance); END
public IQueryable<AllAirports> ReturnAllAirportWithIn50milesOfAPoint(double lat, double lon)
{
    var airports = from d in im.AllAirports.ToList()
           where DistanceBetween(lat, lon, (double)d.Lat, (double)d.Lon) < 1000.00
           select d;
    return airports;
}
public IQueryable<Dinner> FindByLocation(float latitude, float longitude)
{
    List<Dinner> resultList = new List<Dinner>();

    var results = db.Database.SqlQuery<Dinner>("SELECT * FROM Dinners WHERE EventDate >= {0} AND dbo.DistanceBetween({1}, {2}, Latitude, Longitude) < 1000", DateTime.Now, latitude, longitude);
    foreach (Dinner result in results)
    {
        resultList.Add(db.Dinners.Where(d => d.DinnerID == result.DinnerID).FirstOrDefault());
    }

    return resultList.AsQueryable<Dinner>();
}