이 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()
는 개체를 가지고 놀고 쿼리에서 기본이 아닌 생성자를 사용할 수 있습니다.
사용 시간에 가장 효율적인 방법은 아니지만 작은 세트의 옵션입니다.
