1

我有这个返回用户的简单方法:

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 => x.EventId == eventId)] 部分,我无法确切了解如何使用 LINQ 来获得多个结果。我指定“SelectMany”只是一个例子,它可以是你认为正确的任何东西。

这是 RetryWithExpression 的签名供参考:

   public static TValue RetryWithExpression<T, TValue>(Func<ObjectSet<T>, TValue> func, Int32 retryInfiniteLoopGuard = 0)
         where T : class
4

2 回答 2

1

我认为你的表达应该改写如下:

List<Asset> lst = ReliableExecution
    .RetryWithExpression<Asset, List<Asset>>(
        u => u.Where(x => x.EventId == eventId).ToList()
    );

简单来说,SelectMany使用从每个项目 A 中提取项目 B 列表的函子,将“项目 A 的列表列表”扁平化为“项目 B 的列表”;这不是你想做的。

于 2012-04-27T02:04:19.977 回答
1

看起来你想要:

List<Asset> lst = ReliableExecution.RetryWithExpression<Asset, List<Asset>>
                  (u => u.SelectMany(x => x.Where(y => y.EventId == eventId)));

SelectMany期望传递Func的返回 an IEnumerable,然后将其展平。您正在通过列表,Asset然后尝试EventId直接在列表中选择。您真正想要的是使用匹配选择列表中的所有资产EventId,因此需要额外的Where子句。

于 2012-04-27T02:04:25.197 回答