나는 오늘 같은 문제가 있었고 내 솔루션은 Yoda가 나열 한 것과 비슷하지만 유창한 구문에서만 작동합니다.
코드에 솔루션을 적용 : 객체 클래스에 다음 정적 메소드를 추가했습니다.
/// <summary>
/// use this instead of a parameritized constructor when you need support
/// for LINQ to entities (fluent syntax only)
/// </summary>
/// <returns></returns>
public static Func<Naleznosci, Payments> Initializer()
{
return n => new Payments
{
Imie = n.Dziecko.Imie,
Nazwisko = n.Dziecko.Nazwisko,
Nazwa = n.Miesiace.Nazwa,
Kwota = n.Kwota,
NazwaRodzajuOplaty = n.RodzajeOplat.NazwaRodzajuOplaty,
NazwaTypuOplaty = n.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
DataRozliczenia = n.DataRozliczenia,
TerminPlatnosc = n.TerminPlatnosci
};
}
그런 다음 기본 쿼리를 다음으로 업데이트했습니다.
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments.Initializer());
이것은 멤버 초기화의 팽창을 클래스 / 데이터 전송 객체로 푸시한다는 이점이 있다는 점에서 James Manning의 솔루션과 논리적으로 동일합니다.
참고 : 원래는 "Initializer"라는 더 설명적인 이름을 사용하고 있었지만 사용 방법을 검토 한 후 "Initilizer"가 충분하다는 것을 알았습니다 (적어도 제 목적으로는).
최종 메모 :
이 솔루션을 만든 후에는 원래 동일한 코드를 공유하고이를 쿼리 구문에 맞게 적용하는 것이 간단하다고 생각했습니다. 나는 더 이상 사실이라고 생각하지 않습니다. 이 유형의 속기 구성을 사용하려면 위에서 설명한대로 객체 클래스 자체에 존재할 수있는 각각의 (쿼리, 유창한) 유창한 메소드가 필요하다고 생각합니다.
쿼리 구문의 경우 확장 메소드 (또는 사용중인 기본 클래스 외부의 일부 메소드)가 필요합니다. (쿼리 구문은 T가 아닌 IQueryable을 작동 시키려고하기 때문에)
다음은 쿼리 구문에서 작동하도록하는 데 사용한 샘플입니다. (Yoda는 이미 이것을 못 박았지만 처음에는 그것을 얻지 못했기 때문에 사용법이 더 명확 할 수 있다고 생각합니다)
/// <summary>
/// use this instead of a parameritized constructor when you need support
/// for LINQ to entities (query syntax only)
/// </summary>
/// <returns></returns>
public static IQueryable<Payments> Initializer(this IQueryable<Naleznosci> source)
{
return source.Select(
n => new Payments
{
Imie = n.Dziecko.Imie,
Nazwisko = n.Dziecko.Nazwisko,
Nazwa = n.Miesiace.Nazwa,
Kwota = n.Kwota,
NazwaRodzajuOplaty = n.RodzajeOplat.NazwaRodzajuOplaty,
NazwaTypuOplaty = n.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
DataRozliczenia = n.DataRozliczenia,
TerminPlatnosc = n.TerminPlatnosci
};
}
그리고 사용법
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select nalTmp).Initializer().ToList();