2014-02-05 5 views
0

У меня есть следующая структура данных. Data StructureLINQ EntityFramework, сортировка по атрибутам

Я хотел бы дать метод запроса к AttributeId и он должен затем отсортировать List of vehicles значением этого AttributeId.

Например, если у двух транспортных средств есть атрибут с идентификатором 123, а транспортное средство 1 имеет значение «cdf», а транспортное средство2 имеет значение «abc», и я передаю 123 методу, он должен вернуть список транспортных средств с сначала транспортного средства2, а затем транспортного средства1.

Весь метод запроса работает, но я просто борюсь с сортировкой. Если бы кто-нибудь мог указать мне в правильном направлении, это было бы здорово!

Это основной запрос я прямо сейчас:

var query = (from v in context.Vehicles 
    //left join vehicleAttributes 
    join va in context.VehicleAttributes on v.VehicleId equals va.VehicleId into vAttributes 
    from vehicleAttributes in vAttributes.DefaultIfEmpty() 
    where v.FleetId == fleetId 
    select new { v, vehicleAttributes }); 

EDIT: я говорил об этом раньше, я, конечно, попытался простой заказ vehicleAttributes.Value, но так как каждый автомобиль может иметь несколько vehicleattributes Мне почему-то нужно указать, чтобы заказать запрос по значению атрибутаId, который я передаю в запрос.

+0

проверить мой пост, это поможет вам – Developerzzz

+0

Вы хотите вернуть все атрибуты или только атрибуты с идентификатором, который вы передаете в запросе? – DavidN

ответ

0
var query = (from v in context.Vehicles 

         //left join vehicleAttributes 
         join va in context.VehicleAttributes on v.VehicleId equals va.VehicleId into vAttributes 
         from vehicleAttributes in vAttributes.DefaultIfEmpty() 

         where v.FleetId == fleetId 
         orderby vehicleAttributes.Value ascending 
         select new { v, vehicleAttributes }); 
+0

это не сработает, так как автомобиль может иметь несколько атрибутов транспортного средства, и мне почему-то нужно указать, что он должен заказать его по значению атрибутаId, который я передаю методу – Timothy

0

Вам нужно orderby

var query = (from v in context.Vehicles 
       join va in context.VehicleAttributes on v.VehicleId equals va.VehicleId 
       where v.FleetId == fleetId 
       orderby va.Value ascending 
       select new { Id = v.FleetId, Value = va.Value, Date = v.DateCreated }); 
0

Это трудно понять, как это будет работать, учитывая, что AttributeId является первичным ключом и, следовательно, уникальным. Однако, я думаю, этого должно быть достаточно, чтобы вы могли найти свой путь. BTW, вы можете сделать свои запросы намного чище, используя Свойства навигации. Я определил следующий:

public class Vehicle 
    { 
     [Key] 
     public int VehicleId { get; set; } 

     public int FleetId { get; set; } 

     public virtual ICollection<VehicleAttribute> VehicleAttributes { get; set; } 
    } 


int fleetId = 1; 
int attributeId = 1; 
var q = from v in ctx.Vehicles 
    where v.FleetId == fleetId 
    select 
     new 
     { 
      v.VehicleId, 
      v.VehicleAttributes, 
      SortingAttribute = v.VehicleAttributes.FirstOrDefault(va => va.AttributeId == attributeId) 
     } 
    into output 
    orderby output.SortingAttribute.Value descending 
    select output; 
Смежные вопросы