将两个 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);
您可以在查询 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();