2015-11-22 4 views
0

У меня есть стол Installation, который может содержать один или несколько Equipements.Linq: пусть результат подсчета в указанную колонку

И по функциональным причинам я перезаписал свой стол Installation и добавил поле NbrEquipements.

Я хочу, чтобы заполнить это поле Linq, но я застрял ...

Благодаря специальные причин, нет никакой связи между ними с таблицами. Итак, нет члена Installation.Equipements в мой класс. Поэтому нет Installation.Equipements.Count ...

Я пробую кое-что. Вот мой код:

var query = RepoInstallation.AsQueryable(); 

    // Some filter 
    query = query.Where(i => i.City.RegionId == pRegionId)); 

    int?[] etatIds = { 2, 3 }; 
    query = (from i in query 
         select new Installation 
         { 
          NbrEquipements= (from e in RepoEquipement.AsQueryable() 
               where e.InstallationSpecialId == i.SpecialId 
               && (etatIds.Contains(e.EquEtat)) 
               select e.SasId 
               ).Count() 
         }); 

Но это попробовать, я получил эту ошибку:

The entity or complex type 'myModel.Installation' cannot be constructed in a LINQ to Entities query 

Я пробовал некоторые другие вещи, но я всегда оборачиваясь ...

Еще одна вещь, которая может быть полезна для меня: было бы здорово заполнить поле под названием Equipements, которое является List<Equipement>. После этого я смог бы Count этот список ... Возможно ли это?

Скажите, если я не ясно.

Заранее благодарен.

Вот окончательный код:

//In the class: 
    [Dependency] 
    public MyEntities MyEntities { get; set; } 

    //My Methode code: 
    var query = MyEntities .SasInstallations.AsQueryable(); 

    // Some filter 
    query = query.Where(i => i.City.RegionId == pRegionId)); 


    var liste = new List<Installation>(); 
      var queryWithListEquipements = 
       from i in query 
       select new 
       { 
        Ins = i, 
        EquipementsTemp = (from eq in MyEntities.Equipements.AsQueryable() 
                  where eq.SpecialId == i.SpecialId 
                   && (etatIds.Contains(eq.SasEquEtat)) 
                  select eq 
         ).ToList() 

       }; 

      var listWithListEquipements = queryWithListEquipements.ToList(); 

      foreach (var anonymousItem in listWithListEquipements) 
      { 
       var ins = anonymousItem.Ins; 
       ins.Equipements = anonymousItem.EquipementsTemp; 
       ins.NumberEquipements = ins.Equipements.Count(); 
       liste.Add(ins); 
      } 

    return liste; 

Кстати, это очень и очень быстро (даже перечисление Equipements). Так что я работаю именно так, как мне хотелось. Еще раз спасибо за вашу помощь!

+0

Вы хотите получить только «NbrEquipements»? или все свойства 'Installation' plus' NbrEquipements'? –

+0

Я хочу все свойства установки плюс NbrEquipements. – Grimness

+0

Просто создайте подтип 'Installation'. –

ответ

1

Используйте anonymous type. EF не хочет создавать экземпляры объектов внутри запроса.

var results = (from i in query 
    select new 
    { 
     NbrEquipements= (from e in RepoEquipement 
          where e.InstallationSpecialId == i.SpecialId 
          && (etatIds.Contains(e.EquEtat)) 
          select e.SasId 
          ).Count() 
    }) 
    .ToList(); 

Обратите внимание, как я использовал select new вместо select new Installation.

Вы можете использовать данные внутри списка (который сейчас находится в памяти) для создания экземпляров типа Installation, если вы хотите, как это:

var installations = results.Select(x => 
      new Installation 
      { 
       NbrEquipements = x.NbrEquipements 
      }).ToList(); 

Вот как получить список оборудования для каждого объект установки:

var results = (from i in query 
    select new 
    { 
     Installation = i, 
     Equipment = (from e in RepoEquipement 
          where e.InstallationSpecialId == i.SpecialId 
          && (etatIds.Contains(e.EquEtat)) 
          select e).ToList() 
    }) 
    .ToList(); 

Это вернет список анонимных объектов. Каждый объект будет содержать свойство Installation и другое свойство под названием Equipment (которое является списком). Вы можете легко преобразовать этот список (анонимных объектов) в другой список любого типа, который вы хотите.

+0

Я получаю эту ошибку при вызове последней команды: исключение Linq To Entities не распознает метод «System.Linq.IQueryable'1 [Equipement] AsQueryable()» и не может быть переведено в выражение хранилища – Grimness

+0

. Кстати, подумайте, что получение всех Equipements вместо Count() было бы более дорогостоящим? Потому что мне нужен этот список оборудования, кстати ... Спасибо заранее;) – Grimness

+0

@Grimness, какой тип 'RepoEquipement'? это 'DbSet'? –

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