将两个IEnumerable查询组合成一个

4
我需要帮忙将两个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个回答

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,就像你在 .Select(r => new SearchResult(r)) 中所做的那样。请注意,保留了HTML标签。

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

您可以通过使用“and”操作符来组合连续的Where子句条件。

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

那么,只需要将这些“and”条件通过“or”连接起来即可。

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

3
我在这个查询中没有看到CanViewDigital - BradleyDotNET
谢谢,问题在于我需要为每组结果(实体和数字)应用不同的方法。 - SkyeBoniwell

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接