Linq2Sql Трубы и фильтры на объекте внутреннего списка - PullRequest
0 голосов
/ 19 апреля 2009

Я использую 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, а также вызовет проблемы с отображением необходимой мне информации.

Ответы [ 2 ]

0 голосов
/ 11 мая 2009

Вместо этого я решил реализовать другой способ, создав ViewModel, который содержит объект Account и список транзакций. Транзакции были отфильтрованы в том же действии. Из-за отложенной загрузки транзакции сущностей на реальном объекте Account никогда не вызываются, если вы не выполните их итерацию.

0 голосов
/ 19 апреля 2009

В том же соединении SQL и в том же объекте datacontext вызов SQL для получения информации об учетной записи и операция set для получения транзакций практически неизбежны. Насколько я понимаю, вам, по сути, нужно написать sproc, который возвращает два результата таблицы, а затем интерпретировать неприятный результат обратно в две части информации, которую вы хотите.

Может быть, кто-то с большей мудростью, чем я, мог бы сделать это с Linq, я знаю, что вы можете сделать это напрямую в SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...