Only parameterless constructors and initializers are supported in LINQ to Entities
Solution 1:
without more info on 'Payments' this doesn't help much, but assuming you want to create a Payments object and set some of its properties based on column values:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments
{
Imie = nalTmp.Dziecko.Imie,
Nazwisko = nalTmp.Dziecko.Nazwisko,
Nazwa= nalTmp.Miesiace.Nazwa,
Kwota = nalTmp.Kwota,
NazwaRodzajuOplaty = nalTmp.RodzajeOplat.NazwaRodzajuOplaty,
NazwaTypuOplaty = nalTmp.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
DataRozliczenia = nalTmp.DataRozliczenia,
TerminPlatnosci = nalTmp.TerminPlatnosci,
}).ToList();
Solution 2:
If you still want to use your constructor for initialization and not properties (sometimes this behaviour is desired for initialization purposes), you will need to use LINQ to Collections at some point, because LINQ to SQL doesn't know how to translate constructors to SQL queries. You can do that by using AsEnumerable()
.
So your code should look something like this:
var naleznosci =
db.Naleznosci
.Where(nalTmp => nalTmp.idDziecko == idDziec)
.Select(nalTmp => new
{
DzieckoImie = nalTmp.Dziecko.Imie,
DzieckoNazwisko = nalTmp.Dziecko.Nazwisko,
MiesiaceNazwa = nalTmp.Miesiace.Nazwa
Kwota = nalTmp.Kwota,
NazwaRodzajuOplaty = nalTmp.RodzajeOplat.NazwaRodzajuOplaty,
NazwaTypuOplaty = nalTmp.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
DataRozliczenia = nalTmp.DataRozliczenia,
TerminPlatnosci = nalTmp.TerminPlatnosci
}) // Select necessary columns from DB into anonymous type.
.AsEnumerable() // Here comes transfer to LINQ to Collections.
.Select(nalImp => new Payments
(
nalTmp.DzieckoImie,
nalTmp.DzieckoNazwisko,
nalTmp.MiesiaceNazwa,
nalTmp.Kwota,
nalTmp.NazwaRodzajuOplaty,
nalTmp.NazwaTypuOplaty,
nalTmp.DataRozliczenia,
nalTmp.TerminPlatnosci
)) // Use constructor to create your models.
.ToList();
Solution 3:
Having just encountered this error myself, I thought I would add that if the Payment
type is a struct
, you would also encounter the same error because struct
types do not support parameterless constructors.
In that event, converting Payment
to a class and using the object initializer syntax will resolve the issue.
Solution 4:
If you're like me and don't want to have to populate your properties for each query you're building, there is another way to solve this issue.
var query = from orderDetail in context.OrderDetails
join order in context.Orders on order.OrderId equals orderDetail.orderId
select new { order, orderDetail };
At this point you have an IQueryable containing an anonymous object. If you want to populate your custom object with a constructor you can simply do something like this:
return query.ToList().Select(r => new OrderDetails(r.order, r.orderDetail));
Now your custom object (which takes two objects as a parameter) can populate your properties as needed.