0

我正在尝试返回符合我选择的年龄过滤器的年龄视图。我读到 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();
}

那么为什么它适用于生成年龄列表,但不适用于实际的过滤过程呢?这与我的表达方式中使用Wherevs有关系吗?Select

4

1 回答 1

0

必须在 the 之外执行 Age 的查找.Where(将其代码转换为 SQL 语法)

 {
 int tempvalue = int.Parse(ageValue);
 DateTime calculatedAge = DateTime.Now.AddYears(-1*tempvalue);
 var test = actors.Where((bd => bd.BirthDate < calculatedAge)).ToArray();
 return View(test);
 }
于 2014-05-15T17:35:44.527 回答