2010-08-20 3 views
9

프로젝트에서 linq 코드를 디자인하기위한 제안 사항은 무엇입니까? 특히, 크고 복잡한 linq 쿼리의 코드 디자인에 흥미가 있습니까? 예를 들어LINQ 코드 디자인

, 당신은 당신이 거대한 LINQ의 물건을 많이 쓸 필요가 있음을 알고, 어쩌면 당신의 코드 중 일부는 중복 된 부분이있을 것이다, 아마, 당신이 필요합니다

  1. 쉽게 코드를 확인 지지 적 - 당신이 무언가를 바꿀 필요가 있다면 의미합니다. - 하나가 아니라 많은 것을 바꿀 것입니다.

  2. 코드를 읽기 쉽도록 만드십시오 - 뭔가를 찾을 필요가 있다면 - 쉽게 이것을 할 수 있습니다.

예제를 사용할 수도 있습니다. 어쩌면 어디서나 보았던 패턴 일 수도 있습니다. 내 말은

말하는 LINQ 어떤 LINQ, SQL에 LINQ, 개체에 대한 LINQ, LINQ to XML을 등

TNX

+1

좋아하는 답을 표시하는 것을 잊지 마십시오. NetSide의 대답은 좋은 후보가 될 것입니다. – Steven

답변

7
당신이 당신의 개체에 대한 확장을 쓸 수

;

주요 코드;

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

확장자;

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

확장 메서드를 사용하여 여러 번 사용되는 큰 Select 문을 별도로 두는 것을 좋아합니다.

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

사용법 : 이것에 대한

ObjectCtx.SomeEntities.SelectEntityPM(); 
2

한 유용한 패턴이 재사용 술어 라이브러리을 만드는 것입니다. 자세한 내용은 LINQ PredicateBuilder 페이지에서 확인하십시오.

2

봅니다 일 나는 종종 수행

1) 레이아웃 : 항상 다음 줄에 쿼리를 시작합니다. 예 : 이

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

을하지만,이 작업을 수행하지 마십시오 어디에 당신이 할 수있는

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

2) 다수에게 where 절을 사용합니다. 첫 번째 코드보다 더 읽기 쉬운 두 번째 코드를 찾으려고합니다.

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) 가능한 경우 조인을 방지하십시오. LINQ to SQL을 사용하면 이해하기 힘든 join 문을 사용하지 않고도 모든 부모 - 자식 관계를 '점'처리 할 수 ​​있습니다.

4) 종종 많은 쿼리가 비슷하게 보입니다. 사용자 권한에 따라 특정 레코드를 항상 필터링 할 수 있습니다.방법으로이 코드를 추출 할 수 있습니다.

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; 
} 
관련 문제