使用LINQ和EF返回包含多个结果的List

时间:2012-04-27 01:52:20

标签: c# linq entity-framework

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

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

2 个答案:

答案 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子句。