使用 char.isDigit 时 linq 查询中的 ArgumentException
ArgumentException in linq query when using char.isDigit
我有以下简化的 linq 查询:
IQueryable<PersonListItemDbTemp> query =
from pers in db.Person
join pe in db.PersonExtra on pers.PersonID equals pe.PersonID into ppe
from personExtra in ppe.DefaultIfEmpty()
select new PersonListItemDbTemp()
{
PersonnrAreDigits = pers.Personnr != null && pers.Personnr.All(p => char.IsDigit(p))
};
return query;
其中 pers.Personnr 是一个字符串。我得到以下异常:
System.ArgumentException: DbExpressionBinding requires an input expression with a collection ResultType.
Parameternamn: input
vid System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.BindAs(DbExpression input, String varName)
vid System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)
vid
我这里做错了什么?
错误信息有点奇怪,这意味着这里可能存在 EF 中的错误,但问题仍然很清楚:
EF 不知道如何将 string.All(p => char.IsDigit(p))
翻译成 SQL。
您或许可以使用 SqlFunctions 中的助手:
PersonnrAreDigits =
//pers.Personnr != null &&
//pers.Personnr.All(p => char.IsDigit(p))
SqlFunctions.IsNumeric(pers.PersonNr) == 1
我有以下简化的 linq 查询:
IQueryable<PersonListItemDbTemp> query =
from pers in db.Person
join pe in db.PersonExtra on pers.PersonID equals pe.PersonID into ppe
from personExtra in ppe.DefaultIfEmpty()
select new PersonListItemDbTemp()
{
PersonnrAreDigits = pers.Personnr != null && pers.Personnr.All(p => char.IsDigit(p))
};
return query;
其中 pers.Personnr 是一个字符串。我得到以下异常:
System.ArgumentException: DbExpressionBinding requires an input expression with a collection ResultType. Parameternamn: input vid System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.BindAs(DbExpression input, String varName) vid System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding) vid
我这里做错了什么?
错误信息有点奇怪,这意味着这里可能存在 EF 中的错误,但问题仍然很清楚:
EF 不知道如何将 string.All(p => char.IsDigit(p))
翻译成 SQL。
您或许可以使用 SqlFunctions 中的助手:
PersonnrAreDigits =
//pers.Personnr != null &&
//pers.Personnr.All(p => char.IsDigit(p))
SqlFunctions.IsNumeric(pers.PersonNr) == 1