在LINQ表达式中操作变量类型

时间:2014-05-15 15:39:04

标签: c# sql linq lambda notsupportedexception

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

那么为什么它可以用于生成年龄列表,但不适用于实际的过滤过程?是否与我的表达式中WhereSelect的使用有关?

1 个答案:

答案 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);
 }