我想将一些计算属性添加到EntityObject,而不会失去在数据库中再次查询它的可能性。
我创建了一个分部类,并在对象中添加了我需要的字段。比我写了一个静态函数“AttachProperties”,它应该以某种方式添加一些计算值。我不能在客户端上执行此操作,因为其他几个函数会将一些过滤条件附加到查询中。
这些功能应如下所示:
return query.Select(o =>
{
o.HasCalculatedProperties = true;
o.Value = 2;
return o;
});
在我的情况下,计算值取决于几个查找,而不仅仅是一个简单的“2”。此示例适用于IEnumerable,但当然不适用于IQueryable
我首先使用EntityObject作为属性创建了一个新类,并添加了其他必需的字段,但现在我需要这个扩展类具有相同的基本类型。
答案 0 :(得分:1)
首先,在我看来,在Select()中更改对象是一个坏主意,因为它使得其他事情发生(状态更改)而不是方法名称建议(投影),这总是一个麻烦的方法。 Linq植根于函数式编程(无状态)范例,所以这种用法并不是预期的。
但您可以使用返回计算结果的方法扩展您的类,例如:
partial class EntityObject
{
public int GetValue()
{
return this.MappedProp1 * this.MappedProp2;
}
}
从您的问题中判断一下这是否适合您有点困难。如果生成计算值不仅仅涉及来自对象自身属性的简单计算,那么最好不要让实体单独使用并创建从对象图返回计算结果的服务。
答案 1 :(得分:1)
尝试这样的事情:
return from o in collection
select new O()
{
OtherProperty = o.OtherProperty,
HasCalculatedProperties = true,
Value = 2
};
这将创建原始对象的副本以及您需要的更改,并避免在select子句中修改实体时出现的所有混乱。