Sql 嵌套查询没有相应的键

Sql 嵌套查询没有相应的键,sql,linq,join,linq-to-sql,jointable,Sql,Linq,Join,Linq To Sql,Jointable,首先我有一个函数,它有两个参数(经度,纬度) 正如你所意识到的,我有一张叫做StRestaurant的桌子。在这个表中,我有4列(PkRestaurantId、RegionId、Longitude、Latitude) 我需要一个方法,它需要4个参数 public List<RestaurantDetailDto> GetRestaurant(int regionid, decimal latitude, decimal longitude, OrderType orderType)

首先我有一个函数,它有两个参数(经度,纬度)

正如你所意识到的,我有一张叫做StRestaurant的桌子。在这个表中,我有4列(PkRestaurantId、RegionId、Longitude、Latitude)

我需要一个方法,它需要4个参数

 public List<RestaurantDetailDto> GetRestaurant(int regionid, decimal latitude, decimal longitude, OrderType orderType)
    {}
然后我检查订单类型

      switch (orderType)
            {
                case OrderType.Distance:
                    query = query.OrderBy(x => x.DistanceTable.Distance);
                    break;

            // and the anothers
            }
最后,我试着把这个列表作为一个例子

      var queryResult = query.ToList();
我一直犯这个错误:

嵌套查询没有相应的键

我也尝试了上面的查询,但返回的错误相同:s

    var query = context.StRestaurant.Where(x => x.FKRegionId == regionid && x.IsActive).Join(
                context.CalculateDistanceTable(latitude, longitude),
                restaurant => restaurant.PKRestaurantId,
                result => result.PkKeyId,
                (restaurant, result) => new
                    {
                        Restaurant = restaurant,
                        MinumumPackagePrice = restaurant.StRestaurantRegionRelation.FirstOrDefault(x => x.FKRestaurantId == restaurant.PKRestaurantId).MinumumPackageCharge,
                        DistanceTable = result,
                        RestaurantImage = restaurant.StRestaurantImage.Where(x => x.IsDefault && x.FKRestaurantId == restaurant.PKRestaurantId),
                    }
                );

请帮忙

这里有些东西你可以试试。首先,重写SQL函数,使其具有主键:

CREATE FUNCTION CalculateDistanceTable 
(
    -- Add the parameters for the function here
    @lat1Degrees float, 
    @lon1Degrees float
)
RETURNS 
@RestaurantDistances TABLE 
(
    -- Add the column definitions for the TABLE variable here
    PkKeyId int NOT NULL primary key, 
    Distance float NOT NULL
)
AS
BEGIN
    INSERT INTO @RestaurantDistances
    SELECT        dbo.GeoCalculateDistance(@lat1Degrees, @lon1Degrees, Latitude, Longitude) AS Distance, PKRestaurantId AS PkKeyId
    FROM            StRestaurant

    RETURN 
END
GO
此外,您可以尝试更改LINQ连接以使用匿名类型执行连接

var query = from restaurant in context.StRestaurant
            join distance in context.CalculateDistanceTable(latitude, longitude) on new { Key = restaurant.PKRestaurantId } equals new { Key = distance.PkKeyId }
                    where restaurant.FKRegionId == regionid 
                    select new
                        {
                            Restaurant = restaurant,
                            DistanceTable = distance,
                        };

如果这两个选项都没有帮助,请告诉我,我将尝试根据需要更新此答案。

我以前在对结果执行.Include()时看到过这一点。我想您的投影(在第二个示例中)可能在内部执行此操作。你能把这个加到第一部分吗

在本例中,我必须在源表中添加
.Include()

来自上下文中的a.a.Include(“关系”)
在context.MyFunction(…)中加入b
...

当您遇到此错误时?我在尝试执行以下操作时遇到此错误:var response=query.ToList();让我星期一试试。我会让你知道这些是否有用。谢谢你的回答。@doganilker这些错误信息是相同的还是不同的?
CREATE FUNCTION CalculateDistanceTable 
(
    -- Add the parameters for the function here
    @lat1Degrees float, 
    @lon1Degrees float
)
RETURNS 
@RestaurantDistances TABLE 
(
    -- Add the column definitions for the TABLE variable here
    PkKeyId int NOT NULL primary key, 
    Distance float NOT NULL
)
AS
BEGIN
    INSERT INTO @RestaurantDistances
    SELECT        dbo.GeoCalculateDistance(@lat1Degrees, @lon1Degrees, Latitude, Longitude) AS Distance, PKRestaurantId AS PkKeyId
    FROM            StRestaurant

    RETURN 
END
GO
var query = from restaurant in context.StRestaurant
            join distance in context.CalculateDistanceTable(latitude, longitude) on new { Key = restaurant.PKRestaurantId } equals new { Key = distance.PkKeyId }
                    where restaurant.FKRegionId == regionid 
                    select new
                        {
                            Restaurant = restaurant,
                            DistanceTable = distance,
                        };