2010-08-20 31 views
9

Đề xuất của bạn để thiết kế mã LINQ trong dự án là gì? Đặc biệt, tôi thích thiết kế mã của các truy vấn LINQ lớn và phức tạp?Thiết kế mã LINQ

Ví dụ, bạn biết đấy, mà bạn cần phải viết rất nhiều thứ LINQ khổng lồ, có thể một số mã của bạn sẽ có các bộ phận trùng lặp, có thể không, và bạn cần:

  1. Make mã một cách dễ dàng hỗ trợ - có nghĩa là, nếu bạn cần thay đổi điều gì đó. - bạn đang thay đổi một điều, không phải là một trong những điều, không phải nhiều điều

  2. Làm cho mã dễ đọc - có nghĩa là, nếu bạn cần tìm thứ gì đó - bạn dễ dàng thực hiện việc này.

Bạn có thể sử dụng các ví dụ, có thể là thực hành của bạn. Có thể một số mẫu, mà bạn thấy ở bất cứ đâu - bất cứ thứ gì.

Nói LINQ Tôi có nghĩa là bất kỳ LINQ, LINQ to SQL, LINQ to đối tượng, LINQ to XML vv

Tnx

+1

Đừng quên đánh dấu câu trả lời yêu thích của bạn. Câu trả lời của NetSide sẽ là một ứng cử viên tốt. – Steven

Trả lời

7

bạn có thể viết phần mở rộng cho đối tượng của bạn;

Mã chính;

IQuerable itemList = _coreRepository.GetSomeItems() 
       .WithStates(OperationIdentity.SendToSomeWhere) 
       .BetweenDates(StartDate, EndDate); 

Mở rộng;

public static IQueryable<SomeObject> BetweenDates(this IQueryable<SomeObject> query, DateTime startDate, DateTime endDate) 
     { 
      return from p in query 
        where p.CompletedDate >= startDate && p.CompletedDate < endDate 
        select p; 
     } 
3

Tôi thích đặt sang một bên các câu lệnh Select lớn được sử dụng nhiều lần bằng phương pháp mở rộng.

public static IQueryable<SomeEntityPM> SelectEntityPM(this IQueryable<SomeEntity> entities) 
{ 
    return entities.Select(a => new SomeEntityPM { ... }); 
} 

Cách sử dụng:

ObjectCtx.SomeEntities.SelectEntityPM(); 
2

Một mô hình hữu ích cho điều này đang tạo ra một thư viện tái sử dụng vị. Hãy xem trang này trên LINQ PredicateBuilder để biết thêm thông tin.

2

Điều tôi thường làm:

1) Bố cục: luôn bắt đầu truy vấn ở dòng tiếp theo. Ví dụ: Đừng làm điều này

var allCustomersThatDontContainUnpayedOrders = from customer in db.Customers 
               where customer.Orders ... 
               select customer; 

Nhưng làm điều này:

var allCustomersThatDontContainUnpayedOrders = 
    from customer in db.Customers 
    where customer.Orders ... 
    select customer; 

2) Sử dụng nhiều where khoản mà bạn có thể. Tôi cố gắng tìm đoạn thứ hai dễ đọc hơn đoạn đầu tiên:

var results = 
    from customer in db.Customers 
    where customer.Name.Contains(search) && customer.Address.City != null && 
     customer.Employee.IsSenior 
    select customer; 

var results = 
    from customer in db.Customers 
    where customer.Name.Contains(search) 
    where customer.Address.City != null 
    where customer.Employee.IsSenior 
    select customer; 

3) Ngăn tham gia nếu bạn có thể. LINQ to SQL thường cho phép bạn chỉ 'chấm' trên tất cả các quan hệ cha-con mà không sử dụng các câu lệnh khó hiểu join.

4) Thông thường, bạn sẽ thấy nhiều truy vấn trông giống nhau. Bạn luôn có thể muốn lọc các bản ghi nhất định dựa trên quyền của người dùng.Bạn có thể trích xuất mã này theo phương thức:

var customers = db.Customers; 

customers = FilterBasedOnUserRights(customers, currentUser); 

public static IQueryable<Customer> FilterBasedOnUserRights(
    IQueryable<Customers customers, User currentUser) 
{ 
    return 
     from customer in customers 
     where [big complicated where clause] 
     select customer; 
}