2012-01-05 13 views
3

こんにちは私はこのようなテーブルを持っ=>LINQを使用して異なる値を取得する方法は?

私が取得する必要があり
stateID requestNo reqStateID  reqStateDate 
     1   1    13  03.01.2012 10:57 
     2   1    3  03.01.2012 10:58 
     3   2    3  03.01.2012 11:14 
     4   2    3  03.01.2012 11:15 
     5   1    5  03.01.2012 22:28 
     6   1    7  05.01.2012 14:54 
     7   3    3  05.01.2012 14:55 

、最後に加える(reqStateDate)のユニークな要求はありません(requestNo)。 パラメータ(reqStateIDが)私は2つの要求を取得する必要があり、3を取る場合...

public List<ReqStates> GetRequests(int reqStateID) 
    { 
     return (from rs in db.ReqStates 
          where rs.reqStateID== reqStateID 
          orderby rs.reqStateDate descending 
          select rs).Distinct().ToList();    
    } 

を私はこのような何かをしようとしたが、それは動作していません。 requestNo = 2、requestNo = 3となります。 リクエストのreqstateIDは3であり、追加された日付は最新です。 RequestNo = 1 =>最後に追加されたステータスは13です。 これは、(1)が来てはならない理由です。

誰かが私を助けて、簡単な方法を示してくれることを願っています。

答えて

5

を試してみてください。何も指定されていなければ、デフォルトの等価比較子を使用して値を区別します。

  1. が別個にIEqualityComparerを渡します

    あなたはここに2つのオプションがあります。

  2. ReqStatesIEquatableを実装してください。

例:

class ReqStatesComparer: IEqualityComparer<ReqStates> 
{ 
    public bool Equals(ReqStates a, ReqStates b) 
    { 
    return a.requestNo == b.requestNo; 
    } 

    public int GetHashCode(ReqStates rs) 
    { 
    return rs.GetHashCode(); 
    } 
} 


    public List<ReqStates> GetRequests(int reqStateID) 
    { 
     return (from rs in db.ReqStates 
          where rs.reqStateID== reqStateID 
          orderby rs.reqStateDate descending 
          select rs).Distinct(new ReqStatesComparer()).ToList();    
    } 
+0

IEqualityComparerを使用してサンプルを教えてください。 – blackraist

+0

大きな理解可能な例、私はそれを感謝します – blackraist

2

最新のリクエストを取得するには、最新のreqStateDateにIDを指定してrequestNoを送信してください。このような場合は、あなたが行うことができます:

public List<ReqStates> GetRequests(int reqStateID) 
{ 
    return db.ReqStates.Where(rs => rs.reqStateID == reqStateID) 
         .GroupBy(rs => rs.requestNo) 
         .Select(g => g.OrderByDescending(rs => rs.reqStateDate).First()) 
         .ToList();    
} 
+0

私はこれを試してみましたが、私はエラーが出ます: 『最初の』「メソッドをのみ、最終的なクエリ操作として使用することができる方法を使用することを考慮して 『FirstOrDefault』は、この例では代わりに。 " FirstOrDefault()でFirst()に置き換えられましたが、今回は "コマンド定義の準備中にエラーが発生しました。詳細については内部例外を参照してください。"エラーが発生しました。 – blackraist

+0

と内部の例外は{"指定されたメソッドはサポートされていません"}と答えています。 – blackraist

+0

@ user892945このLINQ to SQL、EF、またはLINQ to Objectsはオブジェクトですか? (上のオブジェクトはLinqで上手く動作します...) –

3

私は、あなたが探していますが、全体のオブジェクトに個別のをやって結果を正確にわからないんだけど。そのため、オブジェクトはすべてのフィールドで異なる必要があります。

オブジェクト全体ではなくフィールドを選択しているところで、以下を試してみてください。

次に、必要なフィールドだけを使用するように変更します。

はあなたが値それが必要に異なるものをプロパティでDistinctを伝える必要があり、この

return (from rs in db.ReqStates 
         where rs.reqStateID== reqStateID 
         orderby rs.reqStateDate descending 
         select rs.requestNo).Distinct().ToList(); 
+0

私はすでにそれを試したが、それは私にすべての要求を与える。いいえ、reqStateID == 3を持っている。最初の条件はリクエストの追加日(reqStateDate)が最新のもので、reqStateID == 3である必要があります。 – blackraist

関連する問題