2016-12-20 23 views
1

我在尝试将数据库中的字符串列映射到应用程序中的整数时遇到问题。先在代码中存储函数

我有一个车辆集合的数据库,当表创建时,年份列被指定为varchar。我需要这个值作为一个整数来执行它的计算。

我知道我可以使用int.Parse来转换它,但我需要它在实体框架查询中工作。 int.Parse在linq中不支持实体,所以这个方法已经结束了。

我尝试的下一件事是创建视图并将列转换为int。这工作完美,直到我需要写入数据库,然后抛出一个错误,因为该视图包含派生字段。

我接下来尝试的是使用Pawel Kadluczka的“EntityFramework.CodeFirstStoreFunctions”库。这并不工作,但只有当我直接指定它是这样的:

Store.Vehicles.Where(x => CustomSqlFunctions.ParseInt(x.ModelYear) == 2000) 

凡parseInt函数在C#中被定义为

[CodeFirstDbFunction("ParseInt")] 
public static int ParseInt(string number) { 
    throw new NotSupportedException("Direct calls are not supported."); 
} 

在SQL parseInt函数功能简单地调用cast(@p1 as int)其中@ P1是在传递串。

我的问题是:
是否可以从Vehicle类的属性中调用CustomSqlFunctions.ParseInt(ModelYear) ?.

我已经试过这样:

public int? Year { 
    get { return CustomSqlFunctions.ParseInt(ModelYear); } 
    set { ModelYear = value.ToString(); } 
} 

但我得到当年不支持LINQ到实体

回答

0

我终于搞明白了。这是一个相当简单的解决方案。我回到了计算列的自定义视图。然而,这一次,我保留了被称为“ModelYear”的原始字段,并将字段'Year'添加到了字符串中。

年房地产最终是这样的:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public int? Year { 
    get { return _year; } 
    set { 
     _year = value; 
     ModelYear = value.ToString(); 
    } 
} 

当值设置为年它也被设置为ModelYear为字符串。将模型保存到数据库时,ModelYear字段会更新,并且由于“年”字段标记为“计算”,因此框架也不会尝试保存该字段。

作为一个侧面说明年实际上并没有被称为开始。在逐步完成Entity框架的源代码之后,我发现在评估表达式之前,它首先检查被调用的属性是否实际上是数据库中的映射成员。由于“年份”没有绘制出来,因此包含Year的表达式甚至没有被评估。

0

我认为Year没有映射到数据库中的错误。在这种情况下,你可以这样做等效的“投”:

get 
{ 
    int value; 
    return int.TryParse(ModelYear, out value) ? value : null; 
} 
+0

不幸的是,这不会在我的情况下工作,因为int.Parse(和int.TryParse)不能被转换为一个sql函数在Linq to Entities中使用。 –

相关问题