【发布时间】:2010-08-30 12:33:32
【问题描述】:
我已向实体框架生成的部分类添加了一个部分类。我想添加一个可以绑定到我的 GridView 的计算字段。但是,当我尝试访问新属性时,我收到一条错误消息,指出这是对 Entity Framework 的限制。
是否有任何变通方法来完成此操作?
【问题讨论】:
-
请告诉我们产生错误的代码。
标签: .net asp.net linq entity-framework
我已向实体框架生成的部分类添加了一个部分类。我想添加一个可以绑定到我的 GridView 的计算字段。但是,当我尝试访问新属性时,我收到一条错误消息,指出这是对 Entity Framework 的限制。
是否有任何变通方法来完成此操作?
【问题讨论】:
标签: .net asp.net linq entity-framework
如果不查看您的代码,就无法正确诊断您的问题。不过,我有预感……
创建一个分部类并向其添加一个计算属性根本不是问题。将相同的属性绑定到 GridView 也不是问题,因为 GridView 并不关心,只要该属性是公共的并且访问它本身不会引发异常。
但是...您可能会尝试在查询中使用该属性。实体框架和其他所有 ORM 都会对此感到厌烦,因为没有将该属性转换为基础数据存储(可能是 SQL Server)。因此,当 EF 尝试构造查询数据库所需的 SQL 时,它会吓坏并说 “我不知道如何将此属性转换为有效的 SQL”
确保您没有在查询中使用该属性,您应该没问题。
更新:
如果您希望实际能够在结果集中使用计算列,那么您有两个基本选择:
1.) 在数据库中创建一个包含计算列的视图,并将您的实体绑定到该列而不是原始基础表。您的财产现在将合法地与可以查询的东西相关联。
2.) 确保先执行查询并带回完整(未过滤的)结果集,然后使用常规 LINQ to Object 来获得所需的结果。像这样的:
var query = from o in Context.Orders
where o.Price > 100
select o;
var orders = from order in query.ToList() // Force query to execute
where order.ComputedColumn == 42
select order;
显然,这比选项一效率低,但根据原始查询可能并不可怕。
【讨论】: