2009-04-18 42 views
0

我正在使用Linq2Sql管道/過濾器。我的數據庫由帳戶和交易表組成,其中每個交易行都鏈接到一個帳戶。內部列表對象上的Linq2Sql管道和過濾器

顯示帳戶時,我想顯示帳戶的所有交易。夠簡單。現在我試圖限制以/ accounts/4/{year}/{month}/{day}爲例的交易。

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

那麼,我該如何編寫一個過濾器來返回帳戶,但也過濾返回的交易?

當我運行沒有FilterTransactions探查我得到2 SQL調用...

 
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 

我的想法是,在過濾器中做類似的信息(年度簡單的例子)

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

但是,a.Transactions是一個EntitySet,Where返回一個IEnumerable。

另一種解決方案是將帳戶返回到我的視圖,然後在視圖中調用HtmlHelper,該HtmlHelper調用另一個操作來顯示事務。但是,這將導致1額外的SQL調用,並導致我顯示我需要的信息的問題。

回答

0

相反,我決定通過創建一個包含Account對象和事務列表的ViewModel來實現不同的方式。交易在相同的行動中被過濾。由於延遲加載,實際Account對象上的Entity事務永遠不會被調用,除非您遍歷它們。

0

在相同的SQL連接和相同的數據上下文對象中,獲取帳戶信息和設置操作以獲取事務的SQL調用幾乎是不可避免的。根據我的理解,你基本上必須寫一個返回兩個表結果的sproc,然後將這個討厭的結果解釋回你想要的兩段信息。

也許比我更智慧的人可以用Linq做到這一點,我知道你可以直接在SQL中做到這一點。