既然LINQ to SQL是一个小更成熟,我想知道人们用它来创建使用该技术的n层解决方案的任何技术,因为它似乎不是对我来说很明显。
答案 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并非旨在以这种方式使用。再说一次,如果我没有正确看待事情,有人会告诉我:)