문제

LINQ에서 SQL 클래스에서 외래 키에서 생성 된 속성이 왜 EntitySet 구현하는 객체 IEnumerable, 객체의 위치 DataContext ~이다 Table 구현하는 객체 IQueryable?

편집하다: 명확히하기 위해, 여기에 내가 이해하려는 것을 보여주는 예가 있습니다. This example:

ctx.Matches.Where(x => x.MatchID == 1).Single()
           .MatchPlayers.Max(x => x.Score);

데이터베이스를 두 번칩니다.

ctx.MatchPlayers.Where(x => x.MatchID == 1)
                .Max(x => x.Score);

1 쿼리 만 실행합니다. 흔적은 다음과 같습니다.

exec sp_executesql N'SELECT [t0].[MatchID], [t0].[Date]
FROM [dbo].[Matches] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go
exec sp_executesql N'SELECT [t0].[MatchID], [t0].[PlayerID], [t0].[Score]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go

그리고

exec sp_executesql N'SELECT MAX([t0].[Score]) AS [value]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go

또한 MAX는 데이터베이스가 아닌 C# 레벨에서 수행된다는 것을 보여줍니다.

이것이 일어나는 이유는 IQueryable모래 IEnumerableS, 그래서 왜 그렇지 않습니다 MatchPlayers 첫 번째 예제에서 개체를 구현합니다 IQueryable 후자의 예와 동일한 이점을 얻는 인터페이스.

도움이 되었습니까?

해결책

테이블은 효과적으로 개념적 문제이므로 서버에 실제로 존재하므로 항목을 얻으려면 쿼리해야합니다. 외국 키 항목은 실제로 다른 쿼리에 의해 가져온 것들이므로 그 시점에서 로컬로 사용할 수 있습니다. 그것은 상당히 털이 많은 설명이지만, 그것은 일반적인 개념을 극복하기를 바랍니다.

다른 팁

ctx.Matches.Where(x => x.MatchID == 1).Single()

싱글 ()는 iqueryable (일치)이 아닌 일치를 반환합니다.

싱글 ()을 마지막 단계로 눌러

ctx.Matches
  .Where(m => m.MatchID == 1)
  .Select(m => m.MatchPlayers.Max(mp => mp.Score))
  .Single();

이 쿼리가 보여주는 것은 쿼리에서 MatchPlayers 속성을 사용해도 괜찮다는 것입니다. Asker의 질문에 대한 나의 해석을 다루는 것은 "쿼리에서 엔티티 세트를 사용할 수없는 이유는 무엇입니까?"

이했다 MSDN 포럼에서 해결되었습니다. 추론의 요점은 데이터베이스에 대해 쿼리를하는 동안 추가 및 제거 된 객체를 추적하는 것이 매우 어렵다는 것입니다. 대신, EntitySet은 조작 할 수있는 관련 개체의 로컬 사본입니다. 불행히도, 알다시피, 이것은 Devolving Expressions가 LINQ로 Devolving Expressions의 부작용을 통해 LINQ에서 SQL을 더 잘 수행하는 대신 호출을 객체 호출합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top