我有这堂课:
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
我已经查看了几个有关此主题的帖子,但无法使其中任何一个工作。
答案 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)