문제

LINQ2DB4O에서는 다음이 가능하다는 것을 알고 있습니다

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

그러나 내가 필요한 것은 조건부로 쿼리를 조건부로 만들 수있는 것입니다 (다른 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를 구축하는 것은 Madman의 작품 일 것입니다.

먼저 전화 할 수 있습니다

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

그런 다음 거기에서 계속하십시오. 그러나 이것은 내가 찾고있는 것이 아닙니다.

면책 조항 : 근처의 복제 내 질문 거의 11 개월 전에.
나는 지금 문제를 더 잘 이해할 때 조금 더 분명합니다. 이제 DB4O DEV Eyes 중 일부가 이것에 대해 이것을 잡을 수 있기를 바랍니다.

제안이 있습니까?

도움이 되었습니까?

해결책

예, 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는 실행시 Lambda 표현식에서 최적화 된 쿼리를 추론하려고 시도하며, 실패하면 LINQ 로의 객체로 떨어집니다. 첫 번째는 LINQ에서 DB4O 변환에 대한 쿼리 가능성을 피함으로써보다 직접적이라는 이점이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top