2017-10-30 17 views
0

の1対多の片側からリレーションシップの数を問い合わせるため、指定された半径内で上位のボリュームでトップ10の製品を返すような、本当に複雑なクエリがあります。これまでは、(raw SQLクエリを使用して)特定の半径内のすべての製品を取得するための動作中のクエリがありました。今問題は注文数でソートされています。以下はクエリです。私は必要に応じて詳細を提供することができます。前もって感謝します!C#のEFコア/ LINQ

var prods = _context.Products 
        .FromSql($"SELECT p.* FROM (SELECT s.\"storefrontID\", z.radius, z.distance_unit * DEGREES(ACOS(COS(RADIANS(z.latpoint)) * COS(RADIANS(a.lat)) * COS(RADIANS(z.longpoint - a.lon)) + SIN(RADIANS(z.latpoint)) * SIN(RADIANS(a.lat)))) AS distance FROM public.\"Addresses\" AS a, public.\"Storefronts\" AS s JOIN (SELECT {lat} AS latpoint, {lon} AS longpoint, {radius} AS radius, {distance_unit} AS distance_unit) AS z ON 1=1 WHERE s.\"addressID\" = a.\"addressID\" AND a.lat BETWEEN z.latpoint - (z.radius/z.distance_unit) AND z.latpoint + (z.radius/z.distance_unit) AND a.lon BETWEEN z.longpoint - (z.radius/(z.distance_unit * COS(RADIANS(z.latpoint)))) AND z.longpoint + (z.radius/(z.distance_unit * COS(RADIANS(z.latpoint))))) AS a, public.\"Storefronts\" AS s WHERE distance <= radius AND s.\"storefrontID\" = a.\"storefrontID\"") 
        .Include(p => p.orderProductConnectors.Count()) 
        .OrderByDescending(p => p.orderProductConnectors) 
        .AsNoTracking() 
        .ToList(); 

私はDBソリューションとしてpostgreSQLを使用しています。

+0

? – NetMage

+0

今は500のステータスコードを投げているだけです。私は上記の解決策が正しいとは思わない。私はこの1つを失いました.LINQは私の強い訴訟ではありません: -/ –

+0

'p.orderProductConnectors'とは何ですか?あなたはそれを並べ替えることができないと思いますか? – NetMage

答えて

1

推測:あなたは、現在の `OrderByDescending`は何をしているのです

var prods = _context.Products 
        .FromSql($"SELECT p.* FROM (SELECT s.\"storefrontID\", z.radius, z.distance_unit * DEGREES(ACOS(COS(RADIANS(z.latpoint)) * COS(RADIANS(a.lat)) * COS(RADIANS(z.longpoint - a.lon)) + SIN(RADIANS(z.latpoint)) * SIN(RADIANS(a.lat)))) AS distance FROM public.\"Addresses\" AS a, public.\"Storefronts\" AS s JOIN (SELECT {lat} AS latpoint, {lon} AS longpoint, {radius} AS radius, {distance_unit} AS distance_unit) AS z ON 1=1 WHERE s.\"addressID\" = a.\"addressID\" AND a.lat BETWEEN z.latpoint - (z.radius/z.distance_unit) AND z.latpoint + (z.radius/z.distance_unit) AND a.lon BETWEEN z.longpoint - (z.radius/(z.distance_unit * COS(RADIANS(z.latpoint)))) AND z.longpoint + (z.radius/(z.distance_unit * COS(RADIANS(z.latpoint))))) AS a, public.\"Storefronts\" AS s WHERE distance <= radius AND s.\"storefrontID\" = a.\"storefrontID\"") 
        .OrderByDescending(p => p.orderProductConnectors.Count()) 
        .AsNoTracking() 
        .ToList(); 
+0

ありがとう!これはまさに私が探していたものです! –