2012-02-17 51 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 2012-02-17 14:55:45

回答

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

泛型將爲你做所有這些。

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

不會工作這是一個匿名課程。 – Wegged 2012-02-17 14:59:46

+0

是的,需要將它與其他人提供的答案結合起來創建一個非匿名類,或者你可以提供一個從T中提取DateTime的函數,但是在那個時候函數調用起來並不容易其設計要取代的方法。 – Servy 2012-02-17 15:04:09

-1

你真的不想這樣做。將查詢留在LINQ語法中可以讓框架優化數據查詢。如果你把它放到函數中,所有的數據都必須從數據庫中返回,然後過濾客戶端。呸!有關更多信息,請參閱「爲什麼將LINQ to SQL查詢表達式轉換爲表達式樹?」在http://blogs.msdn.com/b/charlie/archive/2008/01/31/expression-tree-basics.aspx

+0

在枚舉結果之前沒有完成數據庫查詢。您可以在LINQ查詢成爲SQL查詢之前對其應用任何篩選。 – 2012-02-17 15:22:11

+0

@Maciej - 如果該過濾器是一個函數調用,則不會 - 該框架只能在表達式樹上工作。嘗試一下! (然後改變你的投票:) – 2012-02-17 18:58:55

+0

我還沒有downvoted你:-) – 2012-02-18 10:08:56

0

你不能這樣做與匿名對象w/o一些hackery與反思。我將創建一個具有這些屬性的類並從函數返回IENumerable。

1

您需要促進您的對象成爲真正的類型,而不是anopnymous類型,那麼你可以做:

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