2012-02-17 4 views
0
var query = (from material in dataContext.Materials 
      join materialCategories in dataContext.MaterialCategories on material.Id equals 
      materialCategories.Material.Id 
      select new 
        { 
         material.Id, 
         material.Name, 
         material.Taken, 
         materialCategories.CategoryName 
        }); 
//Filter by date 
query = query.Where(x => x.Taken >= minDate && x.Taken <= maxDate); 

나는 추출 할 "query.Where를 (X => x.Taken> = minDate & & x.Taken < = maxDate);" 질의를 반환하는 함수로 전달되지만 함수는 x.Taken이 무엇인지 이해하지 못하는 문제가 있습니다.까지 구축 LINQ의 querys

어떻게해야합니까?

+0

자신의 첫 번째에 대한 몇 가지 연구를? http://msdn.microsoft.com/en-us/library/bb397687.aspx 람다 (Lambdas) 란 함수로, 이미 추출한 것을 거의 의미합니다. 마지막 단계는 매우 쉽기 때문에 분명히 시도하지 않았고 코드 예제를 작성하지 않았습니다. 예 : – deltree

답변

3

이름이없는 유형 대신 이름이 지정된 유형을 사용해야합니다. 당신이 원한다면 당신은 속성으로 필드를 만들 수 있습니다

public class Category 
{ 
    int Id; 
    string Name; 
    DateTime Taken; 
    string CategoryName; 
} 

: 새로운 클래스를 확인 .

그리고 대신 :

select new {...} 

는 클래스 사용

select new Category {...} 

을 그리고 그 후에 당신이 할 수 있습니다 :

private IQueryable<Category> FilterFunction(IQueryable<Category> query) 
{ 
    query = query.Where(x => x.Taken >= minDate && x.Taken <= maxDate); 
    return query; 
} 

또는 IEnumerable을 사용 <>를 내용에 따라 정확히 여기에서하고있다.

0

익명 개체를 메서드에 전달할 수 없습니다. 형식을 만들고 첫 번째 쿼리에서 해당 형식의 새 인스턴스를 반환해야합니다.

0

Generics가이 모든 작업을 수행합니다.

public IQueryable<T> betweenDates<T>(IQueryable<T> query, DateTime maxdate, DateTime mindate) where T : YourClass 
{ 
    return query.Where(x => x.Taken >= minDate && x.Taken <= maxDate); 
} 
+0

작동하지 않는 것은 anon 클래스입니다. – Wegged

+0

네, 비 익명 클래스를 만들기 위해 다른 사람들이 제공 한 대답과 결합해야합니다. 그렇지 않으면 T에서 DateTime을 추출한 함수를 제공 할 수 있습니다. 그러나 그 시점에서 함수는 호출하기가 훨씬 쉬울 것입니다. 대체 할 수 있도록 설계된 메서드 – Servy

-1

정말 그렇게하고 싶지 않습니다. LINQ 구문으로 쿼리를 남겨두면 프레임 워크에서 데이터 쿼리를 최적화 할 수 있습니다. 이를 함수로 가져 오면 모든 데이터가 데이터베이스에서 리턴 된 다음 클라이언트 쪽에서 필터링되어야합니다. 왝! 자세한 내용은 "LINQ to SQL 쿼리 식을 식 트리로 변환해야하는 이유"를 참조하십시오. in http://blogs.msdn.com/b/charlie/archive/2008/01/31/expression-tree-basics.aspx

+0

결과가 열거 될 때까지 수행 된 DB 쿼리가 없습니다. LINQ 쿼리가 SQL 쿼리가되기 전에 모든 필터링을 적용 할 수 있습니다. –

+0

@Maciej - 필터가 함수 호출이 아니라면 - 프레임 워크는 표현식 트리에서만 마술을 사용할 수 있습니다. 시도 해봐! (그리고 투표를 변경하십시오 :) –

+0

나는 당신을 downvoted하지 않았습니다 :-) –

0

리플렉션을 사용하는 일부 해커가없는 익명의 개체로는이 작업을 수행 할 수 없습니다. 나는 이러한 속성을 가지고 함수에서 IENumerable을 반환하는 클래스를 만들 것입니다.

1

당신은 진짜 형이 아닌 anopnymous 형태가 될 개체를 추진해야합니다 그리고 당신은 할 수 있습니다 :

private static Func<YourObject, bool> Predicate(DateTime minDate, DateTime maxDate) 
     { 
      return x => x.Taken >= minDate && x.Taken <= maxDate; 
     }