我有这个返回用户的简单方法:
User usr = ReliableExecution.RetryWithExpression<User, User>(u => u.FirstOrDefault(x => x.UserEmail == userEmail));
现在我需要创建一个类似的方法,但我需要返回一个列表
List<Asset> lst = ReliableExecution.RetryWithExpression<Asset, List<Asset>>(u => u.SelectMany(x => x.EventId == eventId));
我的问题是[SelectMany(x =&gt; x.EventId == eventId)]部分无法编译,我无法准确理解如何使用LINQ获取多个结果。 我已经指定了“SelectMany”作为一个例子,它可以是你认为正确的。
这是RetryWithExpression的签名供参考:
public static TValue RetryWithExpression<T, TValue>(Func<ObjectSet<T>, TValue> func, Int32 retryInfiniteLoopGuard = 0)
where T : class
答案 0 :(得分:1)
我认为你的表达应该改写如下:
List<Asset> lst = ReliableExecution
.RetryWithExpression<Asset, List<Asset>>(
u => u.Where(x => x.EventId == eventId).ToList()
);
简单来说,SelectMany
使用从每个单个项目A中提取项目B列表的仿函数将“项目列表A列表”展平为“项目列表B”;这不是你想要做的。
答案 1 :(得分:1)
好像你想要:
List<Asset> lst = ReliableExecution.RetryWithExpression<Asset, List<Asset>>
(u => u.SelectMany(x => x.Where(y => y.EventId == eventId)));
SelectMany
期望传递的Func
返回IEnumerable
,然后它会变平。您正在浏览Asset
列表,然后尝试直接在列表中选择EventId
。您真正想要的是选择匹配EventId
的列表中的所有资产,因此需要额外的Where
子句。