LINQ to SQL业务对象创建的最佳实践

时间:2010-01-01 06:11:46

标签: c# asp.net linq-to-sql business-objects

我在最近的项目中一直在广泛使用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语句中,它是重要的转换变量 - 不确定这是否有意义,但是等等

很抱歉这个问题很长。 提前感谢您的投入和新年快乐!

1 个答案:

答案 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有更全面的解释。