【问题标题】:Make a complex select in Entity Framework在实体框架中进行复杂的选择
【发布时间】:2017-03-16 23:16:58
【问题描述】:

请帮我做出这个选择:

"SELECT t.id, t.Status, t.CardMachine, t.ValueNow, (6371 * acos( cos( radians(" + 
ent.Latitude.ToString().Replace(',', '.') +
") ) * cos( radians( t.LatitudeNow ) ) * cos( radians( t.LongitudeNow ) - " +
" radians(" + ent.Longitude.ToString().Replace(',', '.') + 
") ) + sin( radians(" + 
ent.Latitude.ToString().Replace(',', '.') +
") ) * sin( radians( t.LatitudeNow ) ) ) ) AS distance 
FROM dbo.Delivers t) TMP " + 
" INNER JOIN dbo.Vehicles v ON v.DeliverId = TMP.id " + 
" WHERE distance < 25 AND TMP.Status = 1  AND CardMachine = 1 
AND v.BoxWidth >= " + 
 ent.MostWidthProduct.ToString().Replace(',', '.') + 
" AND v.BoxLength >= " + 
ent.MostLengthProduct.ToString().Replace(',', '.') +  
" AND v.Status = 1 
ORDER BY valueNow, distance"

使用实体框架。

【问题讨论】:

  • 可以展示一下你试过的c#代码吗?
  • 解决问题的第一步是将其格式化为各个部分。我帮你做怎么样?
  • 您是否创建了 EF 模型并导入了表格(Delivers、Vehicles)?您是否构建了一个仅从这两个表中选择一些列的基本 EF 查询?这些附加代码 (ent.Latitude) 来自哪里?
  • 如果您在 DbContext 中获得实体的类定义,它可以帮助我们回答

标签: c# asp.net database entity-framework select


【解决方案1】:

这是一个相当复杂的查询,但是我已经尽力给你一个答案,我很确定可能有更好或更简洁的方法来编写它,或者使用 linq 表达式:

var latitude = ent.Latitude.ToString().Replace(',', '.');
            var longitude = ent.Longitude.ToString().Replace(',', '.');
            var mostWidthProduct = ent.MostWidthProduct.ToString().Replace(',', '.');
            var mostLengthProduct = ent.MostLengthProduct.ToString().Replace(',', '.');

            using (var db = new db())
            {
                var delivers = db.DeliverSet.Include(a => a.Vehicle).
                    Where(o => WherePredicate(o, latitude, longitude, mostWidthProduct, mostLengthProduct)).
                    OrderBy(o => o.ValueNow).ThenBy(o => OrderPredicate(o,latitude,longitude));

                //Do whatever you want with delivers
            }

使用的方法:

private static double OrderPredicate(Deliver o,double latitude, double longitude)
        {
            return GetDistance(o, latitude, longitude);
        }


        private static bool WherePredicate(Deliver o, double latitude, double longitude, double mostWidthProduct, double mostLengthProduct)
        {
            var distance = GetDistance(o, latitude, longitude);

            return
                distance > 25 &&
                o.Status == 1 &&
                o.CardMachine == 1 &&
                o.Vehicle.BoxWidth >= mostWidthProduct &&
                o.Vehicle.BoxLength >= mostLengthProduct &&
                o.Vehicle.Status == 1;
        }

        private static double GetDistance(Deliver o, double latitude, double longitude)
        {
            var distance = 6371*Math.Acos(Math.Cos(ConvertToRadians(latitude))*
                                          Math.Cos(ConvertToRadians(o.LatitudeNow))*
                                          Math.Cos(ConvertToRadians(o.LongitudeNow) - ConvertToRadians(longitude)) +
                                          Math.Sin(ConvertToRadians(latitude)*
                                                   Math.Sin(ConvertToRadians(o.LatitudeNow))));
            return distance;
        }


        public static double ConvertToRadians(double angle)
        {
            return (Math.PI / 180) * angle;
        }

【讨论】:

  • 什么是WherePredicate
  • 它是 Predicate ,发布答案时我更改了函数调用而不更改名称。我刚刚编辑了它,感谢您的注意
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多