现在 LINQ
to SQL
已经比较成熟了,我想知道人们使用什么技术来创建一个基于该技术的n层解决方案,因为这对我来说并不那么明显。
现在 LINQ
to SQL
已经比较成熟了,我想知道人们使用什么技术来创建一个基于该技术的n层解决方案,因为这对我来说并不那么明显。
好的,我打算给自己提供一个可能的解决方案。
插入/更新从来都不是问题;你可以将业务逻辑封装在一个保存/更新方法中;例如:
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;
}
哦,Rockford Lhotka说,LINQ to SQL是从数据库获取数据的绝妙技术。他建议之后必须将其绑定到“可达领域对象”(又名CSLA对象)。
严肃地说,LINQ to SQL对于n层架构有支持,可以看到DataContext.Update方法。
你可能想要研究一下ADO .Net Entity Framework,作为 LINQ to SQL 的替代方案,虽然它也支持 LINQ。我认为 LINQ to SQL 被设计成相当轻量级和简单,而 Entity Framework 更加重型,可能更适合大型企业应用程序。
LINQ to SQL实际上没有我见过的n层业务架构,因为它创建的对象是在类中创建的,您没有一个可以通过诸如Web服务等方式很好引用的程序集。
我唯一真正考虑它的方式是使用数据上下文来获取数据,然后填充一个中间数据模型,通过该模型进行传递,并在两侧引用它,在客户端使用它 - 然后将它们传回并将数据推回到新的Datacontext或在重新获取它们后智能地更新行。
这是如果我理解你试图达到什么目的的话:\
当我第一次开始研究时,我在ScottGu的博客上问了相同的问题-但我没有看到任何一个场景或应用程序在野外使用LINQ to SQL。
Rob Connery的商店之类的网站更接近提供者。var emps = from e in Employees
join m in Employees
on e.ManagerEmpID equals m.EmpID
select new
{ e,
m.FullName
};
var emps = from e in Employees
join m in Employees
on e.ManagerEmpID equals m.EmpID
select new Employee
{ e,
m.FullName
};
这将返回IEnumerable。
这里是我写的一篇文章关于这个主题。
Linq-to-sql是一个ORM。它不会影响您设计N层应用程序的方式。您可以像使用任何其他ORM一样使用它。
@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();
txtEmployeeName.Text = emps[0].FullName
这就是我所说的“我失去了强类型好处”的意思。我认为我开始同意 Crucible 的观点了;LINQ-to-SQL 并不是设计用于这种方式的。如果我看错了什么,请有人指引我 :)