Я использую Linq2Sql с трубами / фильтрами. Моя база данных состоит из таблиц счетов и транзакций, где каждая строка транзакции связана с учетной записью.
При отображении учетной записи я хочу показать учетную запись со всеми ее транзакциями. Достаточно просто. Теперь я пытаюсь ограничить транзакции, которые отображаются, например, в / account / 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, который вызывает другое действие для отображения транзакций. Однако это приведет к 1 дополнительному вызову sql, а также вызовет проблемы с отображением необходимой мне информации.