Linq to sql 三层体系结构中的LINQ到SQL

Linq to sql 三层体系结构中的LINQ到SQL,linq-to-sql,Linq To Sql,我目前使用三层架构(DAL、BLL、表示层) 我想知道如何使用LINQ到SQL实现3层体系结构。我不知道LINQ应该在DAL还是BLL。LiNQ似乎是DAL和BLL的融合 以前有人在三层体系结构中实现LINQ吗?我认为这取决于您对使用LINQ的看法。在一个普通的计划中,我认为它确实位于DAL中,因为它密切遵循底层数据结构。然后可以在BLL中对其进行抽象 LiNQ创建的对象通常被描述为业务层对象,尽管它们确实需要与数据层进行比通常建议的更高的耦合。但是,如果您的层次结构高于LiNQ中直接表示的层次

我目前使用三层架构(DAL、BLL、表示层)

我想知道如何使用LINQ到SQL实现3层体系结构。我不知道LINQ应该在DAL还是BLL。LiNQ似乎是DAL和BLL的融合


以前有人在三层体系结构中实现LINQ吗?

我认为这取决于您对使用LINQ的看法。在一个普通的计划中,我认为它确实位于DAL中,因为它密切遵循底层数据结构。然后可以在BLL中对其进行抽象

LiNQ创建的对象通常被描述为业务层对象,尽管它们确实需要与数据层进行比通常建议的更高的耦合。但是,如果您的层次结构高于LiNQ中直接表示的层次结构,那么其他控制器可以将其作为业务层进行操作,而LiNQ将变得更像一个数据层


它实际上取决于数据库中表示的对象的范围,以及您希望达到的耦合级别。因为LiNQ强调可查询性,所以它会过度渗透到应用程序中。

LiNQ不适合三层体系结构。它最适合于2层体系结构

我个人在3层做我的学位项目,并决定使用LINQ,但后来因为很多问题我放弃了这个想法。最大的问题是“乐观并发控制”


因为LINQ的实体对象在DataContext的连接环境中工作。所以在更新和删除逻辑的过程中。它给出了错误。

< P>我使用LINQ到SQL/XML,我认为我的应用程序是3层的。预Linq应用程序之间的区别在于,现在的数据访问层更小、更轻,这实际上是一件非常好的事情

在我的旧DAL中,我会有如下方法:

public virtual int CountCustomersInCountry(string country) {
    // Plug in raw SQL.
}

public virtual List<Customer> GetCustomersInCountry(string country) {
    // Plug in raw SQL.
}

public virtual int CountCustomersForDepartment(string department) {
    // Plug in raw SQL.
}

public virtual List<Customer> GetCustomersForDepartment(string department) {
    // Plug in raw SQL.
}

etc. etc. ad-infinitum
公共虚拟int CountCustomersInCountry(字符串国家){
//插入原始SQL。
}
公共虚拟列表GetCustomersInCountry(字符串国家){
//插入原始SQL。
}
公共虚拟整数CustomerForDepartment(字符串部门){
//插入原始SQL。
}
公共虚拟列表GetCustomerForDepartment(字符串部门){
//插入原始SQL。
}
无限等等
我现在有以下几种方法:

public virtual int Count(Expression<Func<T, bool>> where) {
    // Plug in Linq-to-SQL DataContext here.        
}

public virtual T Get(Expression<Func<T, bool>> where) {
     // Plug in Linq-to-SQL DataContext here.   
}

public virtual List<T> Get(Expression<Func<T, bool>> where,  string orderByField, int offset, int count) {
    // Plug in Linq-to-SQL DataContext here.   
}
公共虚拟整数计数(表达式,其中){
//在此插入Linq到SQL数据上下文。
}
公共虚拟T Get(表达式,其中){
//在此插入Linq到SQL数据上下文。
}
公共虚拟列表Get(表达式where、字符串orderByField、int偏移量、int计数){
//在此插入Linq到SQL数据上下文。
}
要调用新的DAL方法,并在DynamicIQ的帮助下,我使用:

int countryCount = Count(c => c.Country == country);
List<Customer> customers = Get(c => c.Country == country, "inserted", 0, 25);
int departmentCount = Count(c => c.Department == department);
List<Customer> customers = Get(c => c.Department == department, "inserted", 0, 25);
intcountrycount=Count(c=>c.Country==Country);
列出客户=获取(c=>c.Country==国家,“插入”,0,25);
内部部门计数=计数(c=>c.部门==部门);
列出客户=获取(c=>c.部门==部门,“插入”,0,25);

在使用Linq2SQL进行添加、更新和删除之前,所有这些都会变成单线调用!我的DAL现在由10个方法组成,与以前一样,对于我的DAL所关注的每个对象,可以很容易地获得20到30个方法!我强烈建议您试着了解它,因为它确实会为您节省大量代码。

LINQ to SQL实际上主要是关于DAL的,它是一种数据访问技术。然而,在一个足够简单的应用程序中,没有什么可以阻止您将LINQ创建的对象传递到业务层,甚至将它们绑定到UI。为什么不呢

不过,您需要意识到,在这种情况下,您将自己与LINQtoSQL绑定得相当紧密。如果这对你的场景没问题-太好了,就用它吧!这是一个设计决策,你需要为自己,根据您的项目的需要

如果系统变得更复杂,特别是如果从数据库表创建的LINQ对象与业务对象的比例不匹配,则始终可以使用业务层从LINQ对象“组装”真正的业务对象。借助这样的工具,您甚至可以编写大量左右分配“monkey”代码:-)

另一方面,如果您遇到这种情况,您可能还希望查看ADO.NET实体框架,而不是LINQ to SQL。EF为您提供了许多这些更高级的功能,这些功能对于一个小型应用程序来说可能是多余的,但对于一个企业应用程序来说可能是绝对关键的。支持多个数据库供应商,将业务对象映射到数据库中不同的物理表示等


Marc

我在DAL项目中添加实体,并为我需要的访问创建一个存储库。如果您确实不希望在BLL中使用Linq到SQL对象,则需要使用双重映射技术。使用存储库模式可以很容易地模拟DAL。

我使用linq和3层编写了一个简单的电话簿,您可以下载它,如果您对该填充有任何疑问,请免费问我


可从以下网址获取:

您可能没有正确使用DataContext的。应为每个“单个工作单元”创建它们。如果您在不同的操作中遇到错误,我怀疑您试图将同一个DataContext对象用于多个操作。这是epic。。。我正在开发一个基于提供商模型的索赔处理应用程序的实现。。。如果我在编写CoreClaimsProvider类时知道这一点就好了。。。那200多种方法将是如此之少。。。天才!!!