代码之家  ›  专栏  ›  技术社区  ›  David

Linq2SQL管道和内部列表对象上的过滤器

  •  0
  • David  · 技术社区  · 15 年前

    我用的是Linq2SQL和管道/过滤器。我的数据库由帐户和事务表组成,其中每个事务行都链接到一个帐户。

    当显示一个帐户时,我想显示该帐户及其所有交易。足够简单。现在,我试图限制/accounts/4/year/month/day显示的交易。

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

    那么,如何编写一个返回帐户的过滤器,同时过滤返回的事务呢?

    当我在没有filterTransactions的情况下运行profiler时,我得到了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。但是,这将导致额外的一个SQL调用,并导致我在显示所需信息时出现问题。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Spence    15 年前

    在同一个SQL连接和同一个DataContext对象中,获取帐户信息的SQL调用和获取事务的set操作都是不可避免的。据我所知,您基本上需要编写一个返回两个表结果的存储过程,然后将讨厌的结果解释回您想要的两条信息。

    也许有比我更聪明的人可以用Linq来完成这项工作,我知道您可以直接用SQL来完成。

        2
  •  0
  •   David    15 年前

    相反,我决定通过创建包含帐户对象和事务列表的ViewModel来实现一种不同的方法。在同一操作中筛选了事务。由于延迟加载,除非对实体事务进行迭代,否则永远不会调用实际帐户对象上的实体事务。