如何在N层解决方案中使用LINQ To SQL?

时间:2008-09-01 14:37:40

标签: linq-to-sql n-tier-architecture

既然LINQ to SQL是一个更成熟,我想知道人们用它来创建使用该技术的n层解决方案的任何技术,因为它似乎不是对我来说很明显。

7 个答案:

答案 0 :(得分:1)

嗯,Rockford Lhotka很遗憾,LINQ to SQL是从数据库中获取数据的绝佳技术。他建议事后他们必须绑定到“达到域名对象”(又名CSLA objetcs)。

说实话,LINQ to SQL支持n层架构,请参阅 DataContext.Update 方法。

答案 1 :(得分:1)

您可能希望查看ADO .Net Entity Framework作为LINQ to SQL的替代方法,尽管它也支持LINQ。我相信LINQ to SQL设计得相当轻巧和简单,而实体框架更重要,可能更适合大型企业应用程序。

答案 2 :(得分:1)

LINQ to SQL实际上没有我见过的n层故事,因为它创建的对象是在类中创建的,剩下的就是它,你真的没有可以组装的程序集通过Web服务等方式很好地引用

我真正考虑的唯一方法是使用datacontext获取数据,然后填充中间数据模型,传递它,并在两端引用它,并在客户端使用它 - 然后将它们传回并在重新获取数据后将数据推回到新的Datacontext或智能更新行。

如果我理解你想要的东西,那就是:\

当我第一次开始查看时,我在他的博客上问过ScottGu同样的问题 - 但是我没有看到过这样使用LINQ to SQL的单一场景或应用程序。像Rob Connery的店面这样的网站更接近提供商。

答案 3 :(得分:1)

好的,我将给自己一个可能的解决方案。

插入/更新从来都不是问题;您可以将业务逻辑包装在Save / Update方法中; e.g。

public class EmployeesDAL
{
    ...
    SaveEmployee(Employee employee)
    {
        //data formatting
        employee.FirstName = employee.FirstName.Trim();
        employee.LastName = employee.LastName.Trim();

        //business rules
        if(employee.FirstName.Length > 0 && employee.LastName.Length > 0)
        {
            MyCompanyContext context = new MyCompanyContext();

            //insert
            if(employee.empid == 0)
             context.Employees.InsertOnSubmit(employee);
            else
            {
              //update goes here
            }

            context.SubmitChanges();


        }
        else 
          throw new BusinessRuleException("Employees must have first and last names");
     }
 }

对于获取数据,或者至少提取来自多个表的数据,您可以使用存储过程或视图,因为结果不是匿名的,因此您可以从外部方法返回它们。例如,使用存储过程:

    public ISingleResult<GetEmployeesAndManagersResult> LoadEmployeesAndManagers()
    {
        MyCompanyContext context = new MyCompanyContext();

        var emps = context.GetEmployeesAndManagers();

        return emps;
    }

答案 4 :(得分:0)

  

说真的,LINQ to SQL支持n层架构,请参阅DataContext.Update方法

我读到的一些内容表明业务逻辑包装了DataContext - 换句话说,您按照建议的方式包装更新。

我传统上编写业务对象的方式我通常也会在BO中封装“加载方法”;所以我可能有一个名为LoadEmployeesAndManagers的方法,它返回一个员工及其直接经理的列表(这是一个人为的例子)。也许它只是我,但在我的前端我宁愿看到e.LoadEmployeesAndManagers()而不是一些很长的LINQ语句。

无论如何,使用LINQ它可能看起来像这样(没有检查语法正确性):

var emps = from e in Employees
                join m in Employees
                on e.ManagerEmpID equals m.EmpID
                select new
                          { e,
                            m.FullName
                          };

现在,如果我理解正确的话,如果我把它放在一个类库中并从我的前端调用它,我可以返回的唯一方法就是IEnumerable,所以我失去了强大的类型。我能够返回强类型对象的唯一方法是创建我自己的Employees类(加上管理器名称的字符串字段)并从我的LINQ to SQL语句的结果填充它然后返回它。但这似乎反直觉......如果我必须做所有这些,LINQ to SQL到底是什么让我买的?

我认为我可能会以错误的方式看事情;任何启蒙都会受到赞赏。

答案 5 :(得分:0)

“我能回归的唯一方法是作为一个IEnumerable,所以我失去了我强大的良好状态”

这是不正确的。实际上,您的查询是强类型的,它只是一个匿名类型。我认为你想要的查询更像是:

var emps = from e in Employees
            join m in Employees
            on e.ManagerEmpID equals m.EmpID
            select new Employee
                      { e,
                        m.FullName
                      };

将返回IEnumerable。

我在这个主题上写的是an article

Linq-to-sql是一个ORM。它不会影响您设计N层应用程序的方式。您使用它的方式与使用任何其他ORM的方式相同。

答案 6 :(得分:0)

@liammclennan

  

哪个会返回IEnumerable。 ... Linq-to-sql是一个ORM。它不会影响您设计N层应用程序的方式。您使用它的方式与使用任何其他ORM的方式相同。

然后我想我仍然感到困惑。是的,Linq-to-Sql是一个ORM;但据我所知,我仍然使用内联sql类型语句乱丢我的前端代码(linq,而不是sql ....但我觉得这应该从前端抽象出来)。

假设我将我们一直在使用的LINQ语句包装为方法中的示例。据我所知,我可以回归的唯一方法就是这样:

public class EmployeesDAL
{
    public IEnumerable LoadEmployeesAndManagers()
    {
            MyCompanyContext context = new MyCompanyContext();

            var emps = from e in context.Employees
            join m in context.Employees
            on e.ManagerEmpID equals m.EmpID
            select new
                      { e,
                        m.FullName
                      };

            return emps;
    }

}

从我的前端代码我会做这样的事情:

EmployeesDAL dal = new EmployeesDAL;
var emps = dal.LoadEmployeesAndManagers();

这当然会返回一个IEnumerable;但我不能像你说的任何其他ORM一样使用它(除非我当然误解),因为我不能这样做(再次,这是一个人为的例子):

txtEmployeeName.Text = emps[0].FullName

这就是我所说的“我失去了强大的善良”。我想我开始同意Crucible; LINQ-to-SQL并非旨在以这种方式使用。再说一次,如果我没有正确看待事情,有人会告诉我:)