2009-04-18 5 views
0

파이프/필터가있는 Linq2Sql을 사용하고 있습니다. 내 데이터베이스는 각 거래 행이 계정에 연결된 계정 및 거래 테이블로 구성됩니다.Linq2Sql 내부 목록 개체의 파이프 및 필터

계정을 표시 할 때 모든 거래와 함께 계정을 표시하고 싶습니다. 충분히 간단합니다. 이제 예를 들어/accounts/4/{year}/{month}/{day}에 표시된 거래를 제한하려고합니다.

 
Account a = AccountsRepository.GetAccounts() 
       .WithID(id) 
       .FilterTransactions(year, month, day) 
       .SingleOrDefault(); 

계정을 반환하기위한 필터를 작성하고 반환 된 트랜잭션을 필터링하려면 어떻게해야합니까? 나는 FilterTransactions없이 프로파일 러를 실행하면

나는 필터 (연도의 간단한 예)

 
public static IQueryable<Account> FilterTransactions(
this IQueryable<Account> qry, int? year, int? month, int? day) 
{ 
    ...loop through each Account 
    a.Transactions = a.Transactions 
    .Where(t => t.Date.Year == year); 
} 

그런 짓을,

 
exec sp_executesql N'SELECT [t0].[ID], [t0].[BankName], 
[t0].[BankCode], [t0].[CardNumber], [t0].[Locale] 
FROM [dbo].[Accounts] AS [t0] 
WHERE [t0].[ID] = @p0',N'@p0 int',@p0=1 

exec sp_executesql N'SELECT [t0].[ID], [t0].[AccountID], 
[t0].[Date], [t0].[Description], [t0].[Amount] 
FROM [dbo].[Transactions] AS [t0] 
WHERE [t0].[AccountID] = @p0',N'@p0 int',@p0=1 

내 사고는 ... 2 SQL 호출 수 그러나 a.Transactions는 EntitySet이고 Where는 IEnumerable을 반환합니다.

또 다른 해결책은 계정을 내보기로 돌아간 다음보기 호출에서 트랜잭션을 표시하는 다른 작업을 호출하는 HtmlHelper입니다. 그러나,이 1 여분의 SQL 호출이 발생하고 나 또한 필요한 정보를 표시하는 데 문제가 발생했습니다.

답변

0

대신 계정 개체와 트랜잭션 목록이 모두 포함 된 ViewModel을 만들어 다른 방법으로 구현하기로 결정했습니다. 거래가 동일한 작업으로 필터링되었습니다. 게으른 로딩으로 인해 실제 계정 개체의 엔터티 트랜잭션은 반복하지 않는 한 호출되지 않습니다.

0

동일한 SQL 연결과 동일한 datacontext 개체에서 계정 정보를 얻기위한 SQL 호출과 트랜잭션을 가져올 집합 연산은 모두 불가피합니다. 내 이해를 위해 기본적으로 두 테이블 결과를 반환하는 sproc을 작성한 다음 불쾌한 결과를 원하는 두 가지 정보로 해석해야합니다.

어쩌면 나보다 더 많은 지혜를 가진 사람이 Linq에서이 작업을 수행 할 수 있습니다. SQL로 직접 처리 할 수 ​​있다는 것을 알고 있습니다.