我正在尝试返回符合我选择的年龄过滤器的年龄视图。我读到 LINQ 不能接受实际的 C# 操作,例如 .ToString() 或 int.Parse,因此您必须在 lambda 表达式本身之外执行它们。
我已经尝试过了,但我仍然收到 NotSupportedException,特别是
LINQ to Entities 无法识别方法 'Int32 CalculateAgeList(System.DateTime)' 方法,并且此方法无法转换为存储表达式。
我已经尝试调试以弄清楚发生了什么,但我似乎无法完全找到问题的背景。
我的退货声明是
else
{
int tempvalue = int.Parse(ageValue);
return View(actors.Where((bd => CalculateAge(bd.BirthDate) == tempvalue)));
}
由于Actors.Age
没有映射,我必须从出生日期计算年龄,这就是CalculateAge
这里的:
private int CalculateAge(DateTime birthday)
{
return ((int)(DateTime.Now - birthday).TotalDays / 365);
}
所以我认为这应该可行,因为我从表达式中删除了所有转换,但它仍然很适合。
我也相信这个“应该”像一个类似的过程一样在生成一个年龄列表以最初过滤(填充存在用于过滤的年龄的下拉框)时工作,如下所示
var AgeList = new List<string>();
var AgeListQry = (from d in db.Actors orderby d.BirthDate select d.BirthDate)
.ToList();
AgeList.AddRange(AgeListQry.Select(bd => CalculateAgeString(CalculateAge(bd)))
.Distinct());
ViewBag.ageValue = new SelectList(AgeList);
对于完整的图片,它也转换为该方法的字符串,因为我不能在表达式中使用 .ToString() 。
private string CalculateAgeString(int age)
{
return age.ToString();
}
那么为什么它适用于生成年龄列表,但不适用于实际的过滤过程呢?这与我的表达方式中使用Where
vs有关系吗?Select