Linq 在EF 4.0中将字符串转换为Int
有没有办法做到这一点?我在数据库中有一个字符串字段,我想在我的LINQ查询中将它解析为int属性(是的,它必须在IQueryable级别,而不是在内存中) 我知道2年前EF 1.0无法做到这一点(即使LINQ to SQL支持这种开箱即用的基本功能)……但我只是想知道现在是否有人想出了这样做的方法 自定义函数映射?特殊语法?什么都可以 更新: 我尝试了一个模型定义的函数,如下所示:Linq 在EF 4.0中将字符串转换为Int,linq,entity-framework,entity-framework-4,linq-to-entities,Linq,Entity Framework,Entity Framework 4,Linq To Entities,有没有办法做到这一点?我在数据库中有一个字符串字段,我想在我的LINQ查询中将它解析为int属性(是的,它必须在IQueryable级别,而不是在内存中) 我知道2年前EF 1.0无法做到这一点(即使LINQ to SQL支持这种开箱即用的基本功能)……但我只是想知道现在是否有人想出了这样做的方法 自定义函数映射?特殊语法?什么都可以 更新: 我尝试了一个模型定义的函数,如下所示: <Function Name="ConvertToInt32" ReturnType="Edm.In
<Function Name="ConvertToInt32" ReturnType="Edm.Int32">
<Parameter Name="v" Type="Edm.String" />
<DefiningExpression>
CAST(v AS INT)
</DefiningExpression>
</Function>
[EdmFunction("Model.Repository", "ConvertToInt32")]
public static int ConvertToInt32(string value)
{
throw new InvalidOperationException("Only valid when used as part of a LINQ query.");
}
铸造(v为整型)
[EdmFunction(“Model.Repository”、“ConvertToInt32”)]
公共静态int ConvertToInt32(字符串值)
{
抛出新的InvalidOperationException(“仅当用作LINQ查询的一部分时有效。”);
}
但它似乎不起作用。我得到运行时异常:
ErrorDescription=Type 'INT' could not be found. Make sure that the required schemas are loaded and that the namespaces are imported correctly.
StackTrace:
at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertTypeName(Node typeName, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertTypeExprArgs(BuiltInExpr astBuiltInExpr, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.<CreateBuiltInExprConverter>b__73(BuiltInExpr bltInExpr, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertBuiltIn(Node astExpr, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.Convert(Node astExpr, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertValueExpression(Node astExpr, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertQueryStatementToDbExpression(Statement astStatement, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.AnalyzeQueryCommand(Node astExpr)
at System.Data.Common.EntitySql.CqlQuery.<AnalyzeQueryExpressionSemantics>b__8(SemanticAnalyzer analyzer, Node astExpr)
at System.Data.Common.EntitySql.CqlQuery.AnalyzeSemanticsCommon[TResult](Node astExpr, Perspective perspective, ParserOptions parserOptions, IEnumerable`1 parameters, IEnumerable`1 variables, Func`3 analysisFunction)
at System.Data.Common.EntitySql.CqlQuery.AnalyzeQueryExpressionSemantics(Node astQueryCommand, Perspective perspective, ParserOptions parserOptions, IEnumerable`1 parameters, IEnumerable`1 variables)
at System.Data.Common.EntitySql.CqlQuery.<>c__DisplayClass4.<CompileQueryCommandLambda>b__3(Node astCommand, ParserOptions validatedParserOptions)
at System.Data.Common.EntitySql.CqlQuery.CompileCommon[TResult](String commandText, Perspective perspective, ParserOptions parserOptions, Func`3 compilationFunction)
at System.Data.Common.EntitySql.CqlQuery.CompileQueryCommandLambda(String queryCommandText, Perspective perspective, ParserOptions parserOptions, IEnumerable`1 parameters, IEnumerable`1 variables)
at System.Data.Mapping.ViewGeneration.Utils.ExternalCalls.CompileFunctionDefinition(String functionFullName, String functionDefinition, IList`1 functionParameters, EdmItemCollection edmItemCollection)
at System.Data.Metadata.Edm.EdmItemCollection.GenerateFunctionDefinition(EdmFunction function)
at System.Data.Common.Utils.Memoizer`2.<>c__DisplayClass2.<Evaluate>b__0()
at System.Data.Common.Utils.Memoizer`2.Result.GetValue()
at System.Data.Common.Utils.Memoizer`2.Evaluate(TArg arg)
at System.Data.Metadata.Edm.EdmItemCollection.GetGeneratedFunctionDefinition(EdmFunction function)
at System.Data.Metadata.Edm.MetadataWorkspace.GetGeneratedFunctionDefinition(EdmFunction function)
at System.Data.Query.PlanCompiler.ITreeGenerator.Visit(DbFunctionExpression e)
InnerException:
找不到类型“INT”。确保加载了所需的架构,并且正确导入了名称空间。
堆栈跟踪:
位于System.Data.Common.EntitySql.SemanticAnalyzer.ConvertTypeName(节点类型名,SemanticResolver sr)
位于System.Data.Common.EntitySql.SemanticAnalyzer.ConvertTypeExprArgs(BuiltInExpr astBuiltInExpr,SemanticResolver sr)
位于System.Data.Common.EntitySql.SemanticAnalyzer.b_u_73(内置Nexpr bltInExpr,SemanticResolver sr)
位于System.Data.Common.EntitySql.SemanticAnalyzer.ConvertBuiltIn(节点astExpr,SemanticResolver sr)
位于System.Data.Common.EntitySql.SemanticAnalyzer.Convert(节点astExpr,SemanticResolver sr)
位于System.Data.Common.EntitySql.SemanticAnalyzer.ConvertValueExpression(节点astExpr,SemanticResolver sr)
位于System.Data.Common.EntitySql.SemanticAnalyzer.ConvertQueryStatementToDbExpression(语句astStatement,SemanticResolver sr)
位于System.Data.Common.EntitySql.SemanticAnalyzer.AnalyzeQueryCommand(节点astExpr)
在System.Data.Common.EntitySql.CqlQuery.b_u8(语义分析器,节点astExpr)
位于System.Data.Common.EntitySql.CqlQuery.AnalyzeSemanticsCommon[TResult](节点astExpr,透视透视图,解析表达式解析表达式,IEnumerable`1参数,IEnumerable`1变量,Func`3分析函数)
位于System.Data.Common.EntitySql.CqlQuery.AnalyzeQueryExpressionSemantics(节点astQueryCommand、透视透视图、解析图、解析图、解析图、IEnumerable`1参数、IEnumerable`1变量)
在System.Data.Common.EntitySql.CqlQuery.c__DisplayClass4.b__3(节点astCommand,ParserOptions validatedParserOptions)
位于System.Data.Common.EntitySql.CqlQuery.CompileCommon[TResult](字符串命令文本,透视图,解析表达式解析表达式,Func`3编译函数)
位于System.Data.Common.EntitySql.CqlQuery.CompileQueryCommandLambda(String queryCommandText、透视图、ParserOptions ParserOptions、IEnumerable`1参数、IEnumerable`1变量)
位于System.Data.Mapping.ViewGeneration.Utils.ExternalCalls.CompileFunctionDefinition(String functionFullName,String functionDefinition,IList`1 functionParameters,EdmItemCollection EdmItemCollection)
位于System.Data.Metadata.Edm.EdmItemCollection.GenerateFunctionDefinition(EdmFunction)
在System.Data.Common.Utils.Memoizer`2.c_uudisplayClass2.b_uu0()中
在System.Data.Common.Utils.Memoizer`2.Result.GetValue()中
at System.Data.Common.Utils.Memoizer`2.Evaluate(TArg arg)
位于System.Data.Metadata.Edm.EdmItemCollection.GetGeneratedFunctionDefinition(EdmFunction)
位于System.Data.Metadata.Edm.MetadataWorkspace.GetGeneratedFunctionDefinition(EdmFunction)
在System.Data.Query.PlanCompiler.ITreeGenerator.Visite(DbFunctionExpression)中
内部异常:
更新:我让它工作如下
<Function Name="ConvertToInt32" ReturnType="Edm.Int32">
<Parameter Name="v" Type="Edm.String" />
<DefiningExpression>
CAST(v AS Edm.Int32)
</DefiningExpression>
</Function>
铸造(v为Edm.Int32)
如果您使用的是EFv4+EDMX,您可以使用它来为您完成任务。然后,您可以在Linq to entities查询中使用该函数。在运行时是否可以将其添加到MetadataWorkspace?理想情况下,我希望Convert.ToInt32执行此功能。谢谢我试过了,但似乎不起作用:请参阅更新的问题。关于在运行时将其添加到元数据工作区的问题非常好,但我不知道答案。无论如何,您将无法将其映射到Convert.ToInt32
,因为您无法将EdmFunction
属性添加到该方法。所述函数必须在ConceptualModels会话中添加。如果字符串是非数值,会发生什么?您能帮助我如何创建模型定义的函数吗?