[C#] LINQ to Entities에서는 매개 변수가없는 생성자와 이니셜 라이저 만 지원됩니다.

이 linq 표현식에이 오류가 있습니다.

var naleznosci = (from nalTmp in db.Naleznosci
                              where nalTmp.idDziecko == idDziec
                              select new Payments
                              (
                                  nalTmp.Dziecko.Imie,
                                  nalTmp.Dziecko.Nazwisko,
                                  nalTmp.Miesiace.Nazwa,
                                  nalTmp.Kwota,
                                  nalTmp.RodzajeOplat.NazwaRodzajuOplaty,
                                  nalTmp.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
                                  nalTmp.DataRozliczenia,
                                  nalTmp.TerminPlatnosci
                              )).ToList();

이 문제를 어떻게 해결할 수 있습니까? 나는 표현의 조합으로 시도합니다 … : /



답변

‘결제’에 대한 추가 정보가 없으면별로 도움이되지 않지만 Payments 객체를 만들고 열 값을 기반으로 속성 중 일부를 설정한다고 가정합니다.

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();


답변

당신은 여전히 (경우에이 문제가 초기화 목적으로 요구되는) 초기화하지 속성에 대한 생성자를 사용하려는 경우, 호출하여 쿼리를 열거 ToList()ToArray(), 다음 사용 Select(…). 따라서 LINQ to Collections를 사용하고 매개 변수가있는 생성자를 호출 할 수 없다는 한계가 있습니다.Select(…) 이 사라집니다.

따라서 코드는 다음과 같아야합니다.

var naleznosci = db.Naleznosci
                          .Where(nalTmp => nalTmp.idDziecko == idDziec)
                          .ToList() // Here comes transfer to LINQ to Collections.
                          .Select(nalImp => new Payments
                              (
                                  nalTmp.Dziecko.Imie,
                                  nalTmp.Dziecko.Nazwisko,
                                  nalTmp.Miesiace.Nazwa,
                                  nalTmp.Kwota,
                                  nalTmp.RodzajeOplat.NazwaRodzajuOplaty,
                                  nalTmp.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
                                  nalTmp.DataRozliczenia,
                                  nalTmp.TerminPlatnosci
                              ))
                          .ToList();


답변

방금이 오류가 발생하면 Payment유형이 인 경우 struct동일한 오류가 발생한다고 덧붙였습니다.struct 매개 변수 인 경우 매개 변수가없는 생성자를 지원하지 않기 .

이 경우 Payment클래스 로 변환 하고 객체 초기화 구문을 사용하면 문제가 해결됩니다.


답변

나와 같고 작성중인 각 쿼리에 대해 속성을 채우지 않으려면이 문제를 해결하는 다른 방법이 있습니다.

var query = from orderDetail in context.OrderDetails
            join order in context.Orders on order.OrderId equals orderDetail.orderId
            select new { order, orderDetail };

이제 익명 오브젝트를 포함하는 IQueryable이 있습니다. 사용자 정의 객체를 생성자로 채우려면 다음과 같이하면됩니다.

return query.ToList().Select(r => new OrderDetails(r.order, r.orderDetail));

이제 사용자 정의 개체 (두 개체를 매개 변수로 사용)는 필요에 따라 속성을 채울 수 있습니다.


답변

먼저 해결책을 피할 것입니다.

from ....
select new Payments
{
  Imie = nalTmp.Dziecko.Imie,
  ....
}

이것은 빈 생성자를 필요로하고 캡슐화를 무시하므로 new Payments ()는 데이터가없는 유효한 지불이라고 말하지만 객체는 도메인에 따라 최소한 값과 다른 필수 필드를 가져야합니다.

필수 필드에 대한 생성자를 갖는 것이 좋지만 필요한 데이터 만 가져옵니다.

from ....
select new
{
  Imie = nalTmp.Dziecko.Imie,
  Nazwisko = nalTmp.Dziecko.Nazwisko
  ....
}
.ToList() // Here comes transfer to LINQ to Collections.
.Select(nalImp => new Payments
 (
  nalTmp.Imie,//assume this is a required field
  ...........
  )
  {
     Nazwisko = nalTmp.Nazwisko //optional field
  })
.ToList();


답변

확장 방법을 사용하여 동일하게 시도 할 수 있습니다. 데이터베이스 사용 제공자는 무엇입니까?

var naleznosci = db.Naleznosci
                          .Where<TSource>(nalTmp => nalTmp.idDziecko == idDziec)
                          .Select<TSource, TResult>(
                             delegate(TSource nalTmp) { return new Payments
                             (
                                 nalTmp.Dziecko.Imie,
                                 nalTmp.Dziecko.Nazwisko,
                                 nalTmp.Miesiace.Nazwa,
                                 nalTmp.Kwota,
                                 nalTmp.RodzajeOplat.NazwaRodzajuOplaty,
                                 nalTmp.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
                                 nalTmp.DataRozliczenia,
                                 nalTmp.TerminPlatnosci
                             ); })
                          .ToList();


답변

그냥 ToList()DbSet전과 Select문 .. 실제는 DbSet쿼리로 저장, 아직 충족되지 것. 호출 한 후에 ToList()는 개체를 가지고 놀고 쿼리에서 기본이 아닌 생성자를 사용할 수 있습니다.

사용 시간에 가장 효율적인 방법은 아니지만 작은 세트의 옵션입니다.