2011-04-08 6 views
3

내 응용 프로그램에 대한 임시 보고서 기능을 만들고 있습니다. "Where"부분에 PredicateBuilder를 사용했지만 지금은 "Select"부분에서 사용할 때 성공하지 못합니다. 코드의선택 내에서 PredicateBuilder 사용

샘플 :

IQueryable<User> usersQuery = db.Users.AsQueryable(); 

    var where = PredicateBuilder.True<User>(); 
    //sample for the users query 
    where = where.And(p => p.Enabled); 


    var selectOrders = PredicateBuilder.True<UserOrder>(); 
    //sample for a query inside user orders 
    selectOrders = selectOrders.And(p => p.Amount > 10); 

    usersQuery = usersQuery.Where(where); //work 
    var query = (from a in usersQuery 
     select new 
       { 
       FirstName = a.FirstName, 
       TotalOrders = a.UserOrders.Where(selectOrders).Count() //could not compile                        
       }).AsQueryable(); 

난 당신이 DynamicLinq에서

.Select("new (TotalOrders = UserOrders.Where(BetAmount > @0).Count()") 

을 할 수 있다고 생각하지 않습니다하지만 난 내에서 일부 SQL 사용자 정의 함수를 호출 원인 내가 그것을 사용할 수 없습니다 '선택'하고 DynamicLinq은 지원하지 않습니다.

+0

어떤 컴파일 오류가 발생합니까? –

+0

형식 인수는 사용법에서 유추 할 수 없습니다. 형식을 인수로 추출 할 수 없습니다. > (selectOrders) 어디로 전달해야합니까? Func Shay

+0

a.UserOrders는 어떤 유형입니까? (selectOrders) .Count() –

답변

3

여기에있는 문제는 실제로 Linq가 SQL 쿼리에서 필요로하는 하위 쿼리를 지원하지 않는다고 생각합니다. 그 이유는 귀하의 경우에는 UserOrders 네비게이션 속성 IQueryable을 구현하지 않으며 쿼리를 실행할 수 없습니다.

내가 잘못했을 수 있습니다. 하지만 이것이 나를 올바르게 증명해줍니다. http://blog.robustsoftware.co.uk/2009/01/why-linq-to-sql-is-not-proper-orm.html

더 나은 ORM을 Entity Framework와 같이 사용해야합니다.

0

어떻게 해결할 수 있습니까? 스키마에 따라 조인 조건을 변경했습니다.

var where = PredicateBuilder.True<User>(); 
//sample for the users query 
where = where.And(p => p.Enabled); 

var selectOrders = PredicateBuilder.True<UserOrder>(); 
//sample for a query inside user orders 
selectOrders = selectOrders.And(p => p.Amount > 10); 

var usersQuery = from u in db.Users.Where(where) 
       join o in db.UserOrders.Where(selectOrders) 
         on u.UserId equals o.UserId 
       group o by u into groupedOrders 
       select new 
       { 
        FirstName = groupedOrders.Key.FirstName, 
        TotalOrders = groupedOrders.Count()                        
       }; 
+0

하지만 쿼리가 변경됩니다. FirstName 및 TotalOrders는 필드가있는 큰 목록의 일부 필드와 자체 쿼리 및 – Shay