Linq搜索对象列表

时间:2015-09-30 14:30:08

标签: c# asp.net-mvc linq

我有这堂课:

public class ExamReviewRequested
{
    public List<ExamReviewRequest> Reviews { get; set;}
}

它的评论属性有这个类的列表:

public class ExamReviewRequest
{
    public string EventCode { get; set; }
    public bool Requested { get; set; }
}

如何使用LINQ搜索特定的EventCode并使用该EventCode返回所选的ExamReviewRequest?在我的视图中,这两个(Row.EventCode具有我想要搜索的值):

ExamReviewRequest er = ViewBag.ExamReviews.Single(x => x.EventCode == Row.EventCode)

ExamReviewRequest er = ViewBag.ExamReviews.Reviews.FirstOrDefault(x => x.EventCode == Row.EventCode)

返回此错误:

Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

我已经查看了几个有关此主题的帖子,但无法使其中任何一个工作。

3 个答案:

答案 0 :(得分:7)

当您将ExamReviews分配给ViewBag时,它们会成为dynamic对象而没有类型设置。错误消息告诉您需要先将其强制转换为使用Linq。

你能做什么

我无法看到您分配ViewBag.ExamReviews的位置,所以如果它的类型为IEnumerable<ExamReviewRequest>,那么:

var examReviews = (IEnumerable<ExamReviewRequest>)ViewBag.ExamReviews
var examReviewRequest = examReviews.Single(x => x.EventCode == Row.EventCode)

或者,如果它是ExamReviewRequested类型,那么:

var examReviews = (ExamReviewRequested)ViewBag.ExamReviews
var examReviewRequest = examReviews.Requests.Single(x => x.EventCode == Row.EventCode)

你应该做什么

您不应将List<ExamViewRequest> / ExamReviewRequested分配给ViewBag。这样你就可以:

// Code to set model previous
var examReviewRequested = model.ExamReviews.Single(x => x.EventCode == Row.EventCode);

model的类型为ExamReviewRequested

答案 1 :(得分:4)

问题是ViewBag.ExamReviews的类型是dynamic,因此编译器不知道如何处理lambda表达式。只需投射该部分,就可以正常使用LINQ:

var requests = (IEnumerable<ExamReviewRequest>) ViewBag.ExamReviews;
var singleRequest = requests.Single(x => x.EventCode == Row.EventCode);

答案 2 :(得分:1)

我认为这个问题的关键是ViewBag是“动态”类型。这意味着表达式ViewBag.ExamReviews也是动态的。你必须抛弃动态才能使用linq agaist。 我猜这里的类型,因为我没有足够的信息。

((IEnumerable<ExamReviewRequest>)ViewBag.ExamReviews).Single(x => x.EventCode == Row.EventCode)