Я использую Linq-to-SQL / XML и считаю свое приложение трехуровневым. Разница между приложениями до 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
Теперь у меня есть следующие методы:
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.
}
Для вызова новых методов DAL и небольшой помощи DynamicLinq я использую:
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);
И все это до того, как вы начнете добавлять, обновлять и удалять, которые становятся однострочными вызовами с Linq2SQL! Мой DAL теперь состоит из 10 методов, где, как и раньше, было легко получить до 20-30 методов для каждого объекта, за которым следил мой DAL! Я настоятельно рекомендую попытаться разобраться в этом, так как это действительно сэкономит вам много кода.