如何在 N 层解决方案中使用 LINQ To SQL?
-
09-06-2019 - |
题
现在 LINQ to SQL 是 小的 更成熟的是,我想知道人们使用该技术创建 n 层解决方案的任何技术,因为它对我来说似乎并不那么明显。
解决方案
LINQ to SQL 实际上并没有我见过的 n 层故事,因为它创建的对象是在类中与其余部分一起创建的,因此您实际上没有一个可以很好地引用的程序集诸如网络服务之类的东西。
我真正考虑的唯一方法是使用数据上下文来获取数据,然后填充中间数据模型,将其传递,并在两侧引用它,并在客户端中使用它 - 然后将它们传回并推送将数据放回到新的 Datacontext 中,或者在重新获取行后智能地更新行。
如果我理解你想要表达的意思的话:\
当我第一次开始查看 ScottGu 的博客时,我在他的博客上问了同样的问题 - 但我还没有看到任何一个场景或应用程序以这种方式使用 LINQ to SQL。像 Rob Connery's Storefront 这样的网站更接近提供商。
其他提示
嗯, 罗克福德·洛特卡 遗憾的是,LINQ to SQL 是从数据库获取数据的出色技术。他建议,之后它们必须绑定到“到达域对象”(又名。CSLA 对象)。
认真地说,LINQ to SQL 支持 n 层架构,请参阅 数据上下文更新 方法。
您可能想调查一下 ADO .Net 实体框架 作为 LINQ to SQL 的替代方案,尽管它也支持 LINQ。我相信 LINQ to SQL 的设计相当轻量级且简单,而实体框架则更加重型,可能更适合大型企业应用程序。
好吧,我会给自己一个可能的解决方案。
插入/更新从来都不是问题;您可以将业务逻辑包装在 Save/Update 方法中;例如
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;
}
认真地说,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 到底给我带来了什么?
我认为我看待事物的方式可能是错误的;任何启发将不胜感激。
“我返回它的唯一方法是作为 IEnumerable,所以我失去了强类型的优点”
这是不正确的。事实上,您的查询是强类型的,它只是一个匿名类型。我认为你想要的查询更像是:
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 的方式相同。
@liammclenan
这将返回 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;但我不能像你说的那样使用它(除非我误解),因为我不能这样做(同样,这是一个人为的例子):
txtEmployeeName.Text = emps[0].FullName
这就是我的意思是“我失去了强烈的打字善良”。我认为我开始同意坩埚。LINQ-to-SQL 并非设计用于以这种方式使用。再说一次,如果我没有正确地看待事物,有人会告诉我方法:)