Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 在EF 4.0中将字符串转换为Int_Linq_Entity Framework_Entity Framework 4_Linq To Entities - Fatal编程技术网

Linq 在EF 4.0中将字符串转换为Int

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

有没有办法做到这一点?我在数据库中有一个字符串字段,我想在我的LINQ查询中将它解析为int属性(是的,它必须在IQueryable级别,而不是在内存中)

我知道2年前EF 1.0无法做到这一点(即使LINQ to SQL支持这种开箱即用的基本功能)……但我只是想知道现在是否有人想出了这样做的方法

自定义函数映射?特殊语法?什么都可以

更新:

我尝试了一个模型定义的函数,如下所示:

    <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会话中添加。如果字符串是非数值,会发生什么?您能帮助我如何创建模型定义的函数吗?