2009-12-01 2 views
3

실제에 linq2db4o 내가 그러나 필요하면 나를 조건부 내 쿼리를 작성 할 수 있습니다 뭔가linq to db4o의 람다 구문은 무엇입니까? 나는 다음을 알고

from Apple a in db 
where a.Color.Equals(Colors.Green) 
select a 

(I 다른 LINQ 변형에서 수 등)

public IEnumerable<Apple> SearchApples (AppleSearchbag bag){ 
    var q = db.Apples; 
    if(bag.Color != null){ 
     q = q.Where(a=>a.Color.Equals(bag.Color)); 
    } 
    return q.AsEnumerable(); 
} 

가능합니다 searchbag은 많은 속성을 보유하고 속성으로 채워진 모든 가능한 조합을 포착하는 거대한 if-tree를 구축하면 미친 사람의 작업이됩니다.

먼저

var q = (from Color c in db select c); 

를 호출하고 거기에서 계속하는 것이 가능하다. 그러나 이것은 내가 찾고있는 것과 정확히 일치하지 않습니다.

면책 조항 : 거의 11 개월 전 my question에 가까운 복제본.
이제는 문제를 더 잘 이해하기 때문에 조금 더 분명해졌습니다. 이제는 db4o 개발자 눈의 일부가 이걸 잡을 수 있기를 바랍니다.

제안 사항이 있으십니까?

답변

6

네, db4o를 사용하여 최적화 된 LINQ 쿼리를 작성할 수 있습니다. 다음과 같이 DB가 정의되어 있는지 수여 :

IObjectContainer db; 

다음은 쿼리입니다 : 오버 반복되는 열거 반환 할 때마다이 경우

public IEnumerable<Apple> SearchApples (AppleSearchbag bag) 
{ 
    var query = db.Cast<Apple>(); 
    // query will be a Db4objects.Db4o.Linq.IDb4oLinqQuery<Apple> 
    if (bag.Color != null) 
     query = query.Where (a => a.Color == bag.Color); 

    return query; 
} 

쿼리가 실행됩니다.

또 다른 가능성은 더 나은 개발자에 의해 인식되는 장점이있는에 IQueryable 메커니즘을 사용하는 것입니다 : 두 경우 모두

public IQueryable<Apple> SearchApples (AppleSearchbag bag) 
{ 
    var query = db.AsQueryable<Apple>(); 
    // query will be a System.Linq.IQueryble<Apple> 
    if (bag.Color != null) 
     query = query.Where (a => a.Color == bag.Color); 

    return query; 
} 

, db4o는이 실행시 람다 표현식에서 최적화 된 쿼리를 추론하려고합니다을, 실패하면 개체에 대한 LINQ로 대체됩니다. 첫 번째 방법은 LINQ to db4o 변환을 쿼리 할 필요가 없으므로보다 직접적인 이점이 있습니다.

+0

브릴리언트. 정확히 내가 뭘 찾고 : D –

+0

AsQueryable 옵션을 시도했지만 메서드가 IObjectContainer에 존재하지 않는 것 같습니다. 이 메서드는 Db4objects.Db4o.Linq의 다른 곳에서 상주합니까? –

+0

db4o의 최신 버전을 사용하고 있습니까? 확실히 거기에 있습니다. 그것은 ISodaQueryFactory에 정의되어 있지만 IObjectContainer는이 인터페이스를 확장합니다. Db4objects.Db4o.Linq에 using 지시문을 추가하기 만하면됩니다. –

관련 문제