我在最近的项目中一直在广泛使用LINQ,但是,我还没有找到一种方法来处理那些看起来既不草率也不实用的对象。
我还会注意到我主要使用ASP.net。
我讨厌将我的数据上下文或LINQ返回类型暴露给我的UI代码。我更喜欢对业务对象进行更细粒度的控制,而且它似乎与数据库紧密耦合是一种良好的做法。
以下是我尝试过的方法..
将项目投放到自定义类
dc.TableName.Select(λ => new MyCustomClass(λ.ID, λ.Name, λ.Monkey)).ToList();
这显然会产生很多用于创建,更新等的连线代码......
围绕返回的对象创建包装器
public class MyCustomClass
{
LinqClassName _core;
Internal MyCustomClass(LINQClassName blah)
{
_core = blah;
}
int ID {get { return _core.ID;}}
string Name { get {return _core.Name;} set {_core.Name = value;} }
}
...
dc.TableName.Select(λ => new MyCustomClass(λ)).ToList();
似乎工作得很好,但重新连接更新似乎几乎不可能在某种程度上打败目的。
我也倾向于喜欢使用LINQ查询进行转换等等,而且我担心这种方法的速度很快,尽管我还没有尝试使用足够大的集来确认。
在保留数据上下文的同时围绕返回的对象创建包装
public class MyCustomClass
{
LinqClassName _core;
MyDataContext _dc;
...
}
在我的对象中保留数据上下文极大地简化了更新,但似乎需要很多开销,尤其是在使用会话状态时。
快速注意:我知道λ的用法在数学上并不正确 - 我倾向于将它用于我的绑定变量,因为它在视觉上很突出,而在大多数lambda语句中,它是重要的转换变量 - 不确定这是否有意义,但是等等
很抱歉这个问题很长。 提前感谢您的投入和新年快乐!
答案 0 :(得分:2)
我在从LINQ查询返回的表上创建“Map”扩展函数。 Map函数返回一个普通的旧CLR对象。例如:
public static MyClrObject Map(this MyLinqObject o)
{
MyClrObject myObject = new MyClrObject()
{
stringValue = o.String,
secondValue = o.Second
};
return myObject;
}
然后,您可以将Map函数添加到LINQ查询中的选择列表,并使LINQ返回CLR对象,如:
return (from t in dc.MyLinqObject
select t.Map()).FirstOrDefault();
如果要返回列表,可以使用ToList获取List<>背部。如果您更喜欢创建自己的列表类型,则需要做两件事。首先,创建一个带有IEnumerable<>的构造函数。基础类型,因为它是一个参数。该构造函数应该复制IEnumerable<>中的项目。采集。其次,创建一个静态扩展方法,从LINQ查询中调用该构造函数:
public static MyObjectList ToMyObjectList(this IEnumerable<MyObjectList> collection)
{
return new MyObjectList (collection);
}
创建这些方法后,它们会隐藏在后台。它们不会使LINQ查询混乱,也不会限制您在查询中执行的操作。
此博客entry有更全面的解释。