我在最近的项目中广泛使用了 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;
...
}
在我的对象中保留数据上下文极大地简化了更新,但似乎有很多开销,尤其是在使用 session 状态时。
快速说明:我知道这里 λ 的用法在数学上是不正确的 - 我倾向于将它用于我的绑定(bind)变量,因为它在视觉上很突出,而且在大多数 lambda 语句中,重要的不是转换变量 - 不确定这是否有意义,但是 blah
很抱歉这个超长的问题。 提前感谢您的投入,祝新年快乐!
最佳答案
我在从 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有更详尽的解释。
关于c# - LINQ to SQL 业务对象创建最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1988010/