我正在尝试返回符合我所选年龄过滤器的年龄视图。我读到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);
}
所以我认为这应该可行,因为我从表达式中删除了所有的转换,但它仍然适合。
我也相信这个"应该"当生成最初过滤的Age的列表时,工作作为类似的过程工作(填充Age以存在用于过滤的下拉框),如下所示
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
与Select
的使用有关?
答案 0 :(得分:0)
必须在.Where
之外执行Age的发现(将其代码转换为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);
}