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