【问题标题】:Combining two IEnumerable queries into one将两个 IEnumerable 查询合二为一
【发布时间】:2014-12-17 18:44:45
【问题描述】:

我在尝试合并两个 IEnumerable 查询时需要帮助。这两个查询分别工作正常,但我需要找到一种方法来组合它们。

一个查询返回的结果包含当前用户可以看到的所有实体书籍。

第二个查询返回当前用户可以看到的所有数字图书。

真的,我只需要一个返回当前用户可以看到的实体书和数字书的查询。

问题是我需要使用不同的方法来检查每种书籍类型的用户权限,而我无法更改该部分。

谢谢!

var user = AllUsers.Current;

var BookFetchResults = rows.Select(r => new SearchResult(r))
    .Where(t => t.BookType == "Physical")
    .Select(r => r)
    .Where(e => e.CanViewPhysical(e.PhysicalBookResult, user) );
return Ok(results);

var BookFetchResults = rows.Select(r => new SearchResult(r))
    .Where(t => t.BookType == "Digital")
    .Select(r => r)
    .Where(e => e.CanViewDigital(e.DigitalBookResult, user) );
return Ok(results);

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您可以在查询 Where 语句中完成所有这些操作:

    var BookFetchResults = rows.Select(r => new SearchResult(r))
         .Where(t => (t.BookType == "Physical" && t.CanViewPhysical(e.PhysicalBookResult, user)) || 
                     (t.BookType == "Digital" && t.CanViewDigital(t.DigitalBookResult, user));
    

    您确实意识到.Select(r => r) 行什么都不做?所有这些行都返回与输入相同的值。如果您正在更改类型,则只需进行选择,就像您在 .Select(r => new SearchResult(r)) 中所做的那样。

    【讨论】:

      【解决方案2】:

      Concat两人:

          var BookFetchResults = rows.Select(r => new SearchResult(r))
              .Where(t => t.BookType == "Physical")
              .Select(r => r)
              .Where(e => e.CanViewPhysical(e.PhysicalBookResult, user))
              .Concat(rows.Select(r => new SearchResult(r))
              .Where(t => t.BookType == "Digital")
              .Select(r => r)
              .Where(e => e.CanViewDigital(e.DigitalBookResult, user)));
      
          return BookFetchResults;
      

      不是最漂亮的代码,但考虑到你特殊的 Where 子句,它是我能想到的最好的。

      【讨论】:

        【解决方案3】:

        把所有的逻辑都放在一个Where

        rows.Select(r => new SearchResult(r))
            .Where(t => ( t.BookType == "Digital" 
                          && t.CanViewDigital(e.DigitalBookResult, user)) 
                        || 
                        ( t => t.BookType == "Physical" 
                          && t.CanViewPhysical(e.PhysicalBookResult, user))
        

        不需要Select(r => r),因为它们不会投射到不同的东西。所以你的第一个查询可能就是。

        rows.Select(r => new SearchResult(r))
            .Where(t => t.BookType == "Physical")
            .Where(e => e.CanViewPhysical(e.PhysicalBookResult, user) );
        

        您可以通过条件与条件组合连续的Where 子句。

        rows.Select(r => new SearchResult(r))
            .Where(t => t.BookType == "Physical" && 
                        t.CanViewPhysical(e.PhysicalBookResult, user) );
        

        那么这只是通过将它们组合在一起来组合这些anded条件的问题。

        【讨论】:

          【解决方案4】:

          首字母

            var BookFetchResults = rows.Select(r => new SearchResult(r)).Where(t => ( t.BookType == "Digital" 
                              ||  ( t => t.BookType == "Physical"))
          

          编辑

          只需使用||

             var BookFetchResults = rows.Select(r => new SearchResult(r)).Where(t => ( t.BookType == "Digital" 
                        && t.CanViewDigital(e.DigitalBookResult, user)) || 
                      ( t => t.BookType == "Physical" && t.CanViewPhysical(e.PhysicalBookResult, user))
          

          【讨论】:

          • 我在这个查询中没有看到CanViewDigital
          • 谢谢,问题是我需要为每组结果(物理和数字)应用不同的方法
          【解决方案5】:

          使用Concat:

          var users = AllUsers.Current;
          
          // physicalResults is IEnumerable<SearchResult>
          var physicalResults = rows.Select(r => new SearchResult(r))
              .Where(t => t.BookType == "Physical")
              .Where(e => e.CanViewPhysical(e.PhysicalBookResult, users) );
          // return physicalResults;
          
          // digitalResults is IEnumerable<SearchResult>
          var digitalResults = rows.Select(r => new SearchResult(r))
              .Where(t => t.BookType == "Digital")
              .Where(e => e.CanViewDigital(e.DigitalBookResult, users) );
          // return digitalResults;
          

          现在,某处……

          var results = physicalResults.Concat(digitalResults).ToList();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-06-23
            • 2012-06-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多