2010-01-01 93 views
2

但是,我一直在我最近的项目中广泛使用LINQ,但我一直无法找到一种处理对象的方式,看起来不是草率或不切实际。LINQ to SQL业务对象创建最佳实践

我还会注意到我主要使用ASP.net。

我讨厌将我的数据上下文或LINQ返回类型暴露给我的UI代码。我更喜欢对业务对象进行更细粒度的控制,而且它似乎与db非常紧密地联系在一起,成为最佳实践。

这里是我试过的方法..


工程项目为一个自定义类

dc.TableName.Select(λ => new MyCustomClass(λ.ID, λ.Name, λ.Monkey)).ToList(); 

显然,这往往会导致大量的wireup代码用于创建,更新等...


创建包装器返回的对象

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语句中,它是重要的转换,而不是变量 - 不知道这是否有什么意义,但没有说

对不起,这是一个非常长的问题。 预先感谢您的意见和新年快乐!

+2

你真的可以使用这样的lambda字符吗?真棒。 – 2010-01-01 07:11:46

+1

我也喜欢lambda字符用法,荣誉。 – 2010-01-01 07:44:58

+0

我无法想象使用λ是否有效,除非您以某种方式将它映射到某个键。尽管如此,它看起来很酷。 – Merritt 2012-03-20 21:15:53

回答

2

我在从LINQ查询返回的表上创建“Map”扩展函数。 Map函数返回一个普通的旧CLR对象。例如:

public static MyClrObject Map(this MyLinqObject o) 
     { 
      MyClrObject myObject = new MyClrObject() 
      { 
       stringValue = o.String, 
       secondValue = o.Second 
      }; 
      return myObject; 
     } 

然后,您可以添加地图功能来选择列表中的LINQ查询并LINQ返回CLR对象,如:

return (from t in dc.MyLinqObject 
      select t.Map()).FirstOrDefault(); 

如果您正在返回一个列表,你可以使用ToList获取列表<>返回。如果你更喜欢创建自己的列表类型,你需要做两件事。首先,创建一个构造函数,该构造函数接受基础类型的IEnumerable <>,因为它是一个参数。该构造函数应该从IEnumerable <>集合中复制项目。其次,创建一个静态扩展方法来调用构造函数从LINQ查询:

 public static MyObjectList ToMyObjectList(this IEnumerable<MyObjectList> collection) 
    { 
     return new MyObjectList (collection); 
    } 

一旦创建了这些方法,他们那种隐藏在后台。它们不会混淆LINQ查询,并且不会限制您可以在查询中执行哪些操作。

此博客entry有一个更透彻的解释。