2016-11-03 2 views
0

Пожалуйста, помогите мне сделать этот выбор:сделать сложный выбор в Entity Framework

"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" 

Использование Entity Framework.

+1

Можете ли вы показать код C#, который вы пробовали? –

+0

Первым шагом в решении вашей проблемы является форматирование его в его части. Как насчет того, чтобы я сделал это для вас? –

+0

Вы создали модель EF и импортировали таблицы (Delivers, Vehicles) еще? Вы создали базовый EF-запрос, который просто выбирает некоторые столбцы из этих двух таблиц? Откуда берутся эти биты добавленного кода ('ent.Latitude')? –

ответ

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; 
     } 
+0

Что такое 'WherePredicate'? –

+0

Это был «Предикат», когда я отправлял ответ, я изменил вызов функции без изменения имени. Я только что отредактировал его, спасибо, что заметил –

Смежные вопросы