Объект или сложный тип «xxx» не может быть создан в запросе LINQ to Entities?

Модель

public partial class SayacOkumalariIstatistik
{
    public string sno { get; set; }
    public Nullable<System.DateTime> okuma_tarihi { get; set; }
    public Nullable<decimal> TotalUsageValue { get; set; }
    public string UsageType { get; set; }
}

функция

public IList<SayacOkumalariIstatistik> SayacOkumalariGetir()
{
    #region linq concat
    IEnumerable<SayacOkumalariIstatistik> sayac_okumalari_istatistik = entity.TblSayacOkumalari
        .Select(x => new SayacOkumalariIstatistik
        {
            sno = x.sno.ToString() + "T1",
            okuma_tarihi = x.okuma_tarihi,
            TotalUsageValue = x.toplam_kullanim_T1,
            UsageType = "T1"
        })
        .Concat(entity.TblSayacOkumalari.Select(x => new SayacOkumalariIstatistik
         {
             sno = x.sno.ToString() + "T2",
             okuma_tarihi = x.okuma_tarihi,
             TotalUsageValue = x.toplam_kullanim_T2,
             UsageType = "T2"
         }))
         .Concat(entity.TblSayacOkumalari.Select(x => new SayacOkumalariIstatistik
         {
              sno = x.sno.ToString() + "T3",
              okuma_tarihi = x.okuma_tarihi,
              TotalUsageValue = x.toplam_kullanim_T3,
              UsageType = "T3"
         }));
        #endregion

        // Error occurs in here
        return sayac_okumalari_istatistik.ToList();
    }

И сообщение об ошибке - это заголовок моего вопроса. Почему возникает эта ошибка.

Спасибо.


person AliRıza Adıyahşi    schedule 11.07.2012    source источник


Ответы (2)


Сообщение об ошибке говорит само за себя. Вы не можете и не должны использовать свои классы сущностей в качестве проекционных DTO (я предполагаю, что SayacOkumalariIstatistik является таким классом)

У вас есть как минимум 3 варианта:

  1. Сначала извлеките исходные объекты, затем выполните проекции с помощью Linq на объекты (т.е. после вызова ToList).
  2. Создайте класс DTO (SayacOkumalariIstatistikViewModel, SayacOkumalariIstatistikDTO, что угодно) и используйте его в своем запросе.
  3. Используйте анонимные объекты для проекции.
person Diego Mijelshon    schedule 11.07.2012

Это было сделано для того, чтобы было четкое различие/точка разрыва между Linq to Entities и Linq для объектов. В Linq to Sql вы можете легко выполнять большие операции в памяти, а не в базе данных, даже не подозревая, что код будет это делать.

Вы должны возвращать только анонимные типы, примитивы, типы Entity или их комбинацию.

person Maslow    schedule 11.07.2012