2012-02-17 11 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); 

Iを抽出する "query.Whereを(X => x.Taken> = MinDateプロパティ& & x.Taken < = maxDateの);"クエリを返す関数には問題がありますが、関数はx.Takenが何であるかを理解していません。アップ構築LINQのquerys

これはどのように達成できますか?

+0

独自の最初のいくつかの研究を行いますか? http://msdn.microsoft.com/en-us/library/bb397687.aspxラムダは関数です。つまり、既に抽出されているものをほとんど意味します。最後の手順は非常に簡単なので、あなたが試したことがない&明らかにコードを書いていないことは明らかです。 – 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クエリになる前に、任意のフィルタリングをLINQクエリに適用できます。 –

+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; 
     } 
関連する問題