更改LINQ语句中对象的值

时间:2012-02-07 08:54:10

标签: linq linq-to-entities

我想将一些计算属性添加到EntityObject,而不会失去在数据库中再次查询它的可能性。

我创建了一个分部类,并在对象中添加了我需要的字段。比我写了一个静态函数“AttachProperties”,它应该以某种方式添加一些计算值。我不能在客户端上执行此操作,因为其他几个函数会将一些过滤条件附加到查询中。

这些功能应如下所示:

return query.Select(o =>
{
   o.HasCalculatedProperties = true;
   o.Value = 2;

   return o;
});

在我的情况下,计算值取决于几个查找,而不仅仅是一个简单的“2”。此示例适用于IEnumerable,但当然不适用于IQueryable

我首先使用EntityObject作为属性创建了一个新类,并添加了其他必需的字段,但现在我需要这个扩展类具有相同的基本类型。

2 个答案:

答案 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子句中修改实体时出现的所有混乱。