将两个IEnumerable查询合并为一个

时间:2014-12-17 18:44:46

标签: c# .net

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

5 个答案:

答案 0 :(得分:6)

您可以在查询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))中一样。

答案 1 :(得分: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条款,它是我能想到的最佳代码。

答案 2 :(得分:2)

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

然后,只需要通过将这些条件组合在一起来组合这些条件。

答案 3 :(得分:1)

初始

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

答案 4 :(得分:1)

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