将两个 IEnumerable 查询合并为一个

本文关键字:一个 合并 两个 IEnumerable 查询 | 更新日期: 2023-09-27 18:34:34

我需要帮助尝试组合两个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);

将两个 IEnumerable 查询合并为一个

您可以在查询 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))中所做的那样。

只需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条款,这是我能想到的最好的代码。

只需将所有逻辑放入一个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) );

然后,只需将这些条件和条件组合在一起即可。

初始

  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))

使用 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();