c# - LINQ to SQL 业务对象创建最佳实践

标签 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;
    ...
}

在我的对象中保留数据上下文极大地简化了更新,但似乎有很多开销,尤其是在使用 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/

相关文章:

c# - 浏览器关闭时使 ASPXAUTH Cookie 过期

asp.net - Html.Encode 不返回任何内容

c# - SQL Server 数据库不会更新来自网站的信息

c# - 在 Linq to SQL 中获取 LINQ 命令发出的 SQL 查询

c# - 为什么 C# 不需要命名空间或完整命名空间(完全限定名称)?

c# - 如何在页面加载时启动 .exe 文件以保存或运行?

c# - ODBC 连接到 Excel 错误

ASP.NET 捕获引用的脚本文件异常

linq-to-sql - 带有旧数据库和 Linq to SQL 的存储库模式

.net - 为什么我应该在Linq2SQL上使用 Entity Framework