【问题标题】:Linq2Sql Pipes and Filters on inner list object内部列表对象上的 Linq2Sql 管道和过滤器
【发布时间】:2009-04-18 23:10:29
【问题描述】:

我正在使用带有管道/过滤器的 Linq2Sql。我的数据库由 Accounts 和 Transactions 表组成,其中每个 Transaction 行都链接到一个 Account。

显示帐户时,我想显示该帐户及其所有交易。很简单。现在我正在尝试限制 /accounts/4/{year}/{month}/{day} 显示的交易。

帐户 a = AccountsRepository.GetAccounts() .WithID(id) .FilterTransactions(年、月、日) .SingleOrDefault();

那么我怎样才能编写一个过滤器来返回账户,同时过滤返回的交易呢?

当我在没有 FilterTransactions 的情况下运行分析器时,我会收到 2 个 sql 调用...

exec sp_executesql N'SELECT [t0].[ID], [t0].[BankName], [t0].[BankCode], [t0].[CardNumber], [t0].[Locale] FROM [dbo].[帐户] AS [t0] WHERE [t0].[ID] = @p0',N'@p0 int',@p0=1 exec sp_executesql N'SELECT [t0].[ID], [t0].[AccountID], [t0].[日期], [t0].[描述], [t0].[金额] FROM [dbo].[交易] AS [t0] WHERE [t0].[AccountID] = @p0',N'@p0 int',@p0=1

我的想法是,在过滤器中执行类似(当年的简单示例)

公共静态 IQueryable FilterTransactions( 这个 IQueryable qry, int?年,诠释?月,int?天) { ...循环遍历每个帐户 a. 交易 = a. 交易 .Where(t => t.Date.Year == 年); }

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

另一种解决方案是将帐户返回到我的视图,然后在视图中调用 HtmlHelper,该 HtmlHelper 调用另一个操作来显示事务。但是,这会导致 1 个额外的 sql 调用,并且还会导致我在显示所需信息时出现问题。

【问题讨论】:

    标签: asp.net-mvc linq linq-to-sql


    【解决方案1】:

    在同一个 SQL 连接和同一个 datacontext 对象中,获取账户信息的 SQL 调用和获取交易的集合操作几乎是不可避免的。据我了解,您基本上必须编写一个返回两个表结果的存储过程,然后将讨厌的结果解释回您想要的两条信息。

    也许比我更有智慧的人可以用 Linq 做到这一点,我知道你可以直接在 SQL 中做到这一点。

    【讨论】:

      【解决方案2】:

      相反,我决定通过创建一个包含 Account 对象和交易列表的 ViewModel 来实现不同的方式。交易在同一操作中被过滤。由于延迟加载实际 Account 对象上的实体事务,除非您对其进行迭代,否则永远不会调用它们。

      【讨论】:

        猜你喜欢
        • 2021-09-26
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多