在EF 4.0中将string转换为Int
有没有办法做到这一点? 我在数据库中有一个string字段,我想parsing它到我的LINQ查询中的int属性(是的,它必须在IQueryable级别,而不是在内存中)。
我知道2年前,EF 1.0无法做到这一点(即使LINQ to SQL支持这种基本function),但我只是想知道是否有人提出了一个在这一点上做到这一点?
自定义函数映射? 特殊的语法? 任何东西….
更新:
我尝试了一个模型定义的函数如下:
<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."); }
但似乎并不奏效。 我得到运行时exception:
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:
更新:我得到它的工作如下
<Function Name="ConvertToInt32" ReturnType="Edm.Int32"> <Parameter Name="v" Type="Edm.String" /> <DefiningExpression> CAST(v AS Edm.Int32) </DefiningExpression> </Function>
如果您正在使用EFv4 + EDMX,您可以创build自定义模型定义的函数 ,它将为您执行CAST 。 然后,您可以在Linq-to-entities查询中使用该函数。
- EF 4.1代码优先:如何使用包含和/或select方法命令导航属性?
- 如何将TimeSpan超过24小时映射到SQL Server Code First?
- 什么时候应该创build一个新的DbContext()
- ObjectContext实例已经处理完毕,不能再用于需要连接的操作了
- 可空属性到实体字段,entity framework通过Code First
- 各种数据库的entity framework提供者列表
- c#entity framework:正确使用库类中的DBContext类
- 将System.ComponentModel默认值Attrbute中的DateTime属性的默认值设置为DateTime.Now
- 从entity framework5升级到6