首页 > 代码库 > LINQ to Entities 不识别方法“Int32 Parse(System.String)”,因此该方法无法转换为存储表达式。解决
LINQ to Entities 不识别方法“Int32 Parse(System.String)”,因此该方法无法转换为存储表达式。解决
问题描述
最近在用LINQ to Entities,看看下面的代码
//获取分页数据
var admins = from aa in db.VAccountAdmins
select aa;
//处理过滤规则
if (null != filterRules)
{
JArray roles = (JArray) JsonConvert.DeserializeObject(filterRules);
foreach (var fr in roles)
{
string field = fr["field"].ToString();
string op = fr["op"].ToString();
string value = http://www.mamicode.com/fr["value"].ToString();
switch (field)
{
case "account_id":
switch (op)
{
case "all":
break;
case "equal":
admins = admins.Where(a => a.account_id == int.Parse(value));
break;
}
break;
}
}
//处理排序
PagedList<VAccountAdmin> alist = null;
if (order == "desc")
{
alist = admins.OrderByDescending(a => sort).ToPagedList(page, rows);
}
else
{
alist = admins.OrderBy(a => sort).ToPagedList(page, rows);
}
//返回easy json数据
var gridData = http://www.mamicode.com/new
{
total = db.VAccountAdmins.ToList().Count,
rows = alist
};
return Json(gridData);
乍一看没问题,可是运行却抛出异常:
原因分析
LINQ在筛选条件中如果使用率lanbla表达式,则不能在使用ToString、Int.Palse等C#代码。深层次的原因在于lambula表达式的解析。
解决方案
把C#代码单独写出来,然后LINQ里面仅仅传送变量。
switch (field)
{
case "account_id":
switch (op)
{
case "all":
break;
case "equal":
int aid = int.Parse(value);
admins = admins.Where(a => a.account_id ==aid );
break;
}
break;
}