使用 LINQ Select 和 Lambda 避免 2100 rpc 限制

Posted

技术标签:

【中文标题】使用 LINQ Select 和 Lambda 避免 2100 rpc 限制【英文标题】:Avoiding the 2100 rpc limit with LINQ Select and Lambda 【发布时间】:2013-10-08 10:30:33 【问题描述】:

我有以下问题。在其中,我正在执行 Take(2100) 以避免施加 2100 rpc 限制。

 var query =
     from result in staging_sparc_sophis_trade.AsQueryable()
     where deals.Take(2100).Contains(result.TRADE_ID)
     select new traded_product()
                        
        Deal = result.TRADE_ID,
        CostCentre = result.FTP_COSTCTR,
       InvolvedPartyId = R_GEN_002(result.hsbc_source_system_instance, "", result.CNPTY_ACRONYM
     ;

我想知道的是,有没有一种方法可以删除 Take(2100) 部分并将其替换为 Deal 行中的 lambda 语句,以检查交易是否在我正在搜索的列表(交易)中为了?

【问题讨论】:

hitting the 2100 parameter limit (sql-server) when using Contains() 的可能重复项 @MikaelÖstberg 是的,我正在考虑做一个循环并在最后加入所有结果。但我不确定是否有优雅的 Lambda 解决方案。不要想。 我们为 mssql 使用了参数化数据表。它可能不是完美的解决方案,但应该可以解决问题。 【参考方案1】:

我找到了解决问题的两种方法。 解决方案1.如果我直接在SqlServer物理机上运行查询,不会出现问题。

在下一部分进行过滤: 去掉“Where子句”

var query =
 from result in staging_sparc_sophis_trade.AsQueryable()
 --where deals.Take(2100).Contains(result.TRADE_ID)
 select new traded_product()
                    
    Deal = result.TRADE_ID,
    CostCentre = result.FTP_COSTCTR,
   InvolvedPartyId = R_GEN_002(result.hsbc_source_system_instance, "", result.CNPTY_ACRONYM
 ;

在这部分代码中添加过滤部分。它运行得有点慢,但仍然有效。我认为它运行速度较慢,因为我在每次迭代中都在搜索完整列表。

foreach (var result in query)

if (!deals.contains(result.TRADE_ID))

--Actions


【讨论】:

以上是关于使用 LINQ Select 和 Lambda 避免 2100 rpc 限制的主要内容,如果未能解决你的问题,请参考以下文章

Sql-Linq-Lambda对照表

LINQ 以 Lambda 形式选择不同计数

Lambda表达式中 select 怎么动态添加查询字段

sql linq lambda 对比

是否可以将 Linq 中的 lambda 参数化为实体选择

帮助我使用实体框架从 SQL 转换为 linq 嵌套 lambda 表达式