0

ここに画像の説明を入力

最初のテーブルはビューで、2 番目は必要な結果です

この以下のクエリは正常に機能します

List<BTWStudents> students = (from V in db.vwStudentCoursesSD
        where classIds.Contains(V.Class.Value)
        select new BTWStudents
                    {
                    StudentId = V.StudentId
                    Amount= V.PaymentMethod == "Cashier Check" ? V.Amount: "0.00"
                    }).Distinct().ToList();

しかし、文字列の書式設定を追加するためにリストに変更しました(以下を参照)

List<BTWStudents> students = (from V in db.vwStudentCoursesSD
        where classIds.Contains(V.Class.Value)
        select new {V}).ToList().Select(x => new BTWStudents
                    {
                    StudentId = V.StudentId
                    Amount= V.PaymentMethod == "Cashier Check" ? String.Format("{0:c}",V.Amount): "0.00"
                    }).Distinct().ToList();

この2番目のクエリでこれを取得します

ここに画像の説明を入力

2番目のクエリでdistinctが機能しないのはなぜですか?

4

3 に答える 3

0

オブジェクトを操作する場合(この場合、SelectVだけでなくSelectnew {V}を使用しているため、ラップされた匿名型)、Distinctはオブジェクトを呼び出します。比較を行う場合はEqualsです。内部的には、これはオブジェクトのハッシュコードをチェックします。この場合、フィールドに同じ値が含まれていても、2つのオブジェクトのハッシュコードが異なります。これを修正するには、オブジェクトタイプのEqualsをオーバーライドするか、カスタムIEqualityComparer実装をDistinctオーバーロードに渡す必要があります。「DistinctIEqualityComparer」をオンラインで検索すると、いくつかの例を見つけることができるはずです。

于 2012-06-21T17:15:44.867 に答える
0

これを試してください(最初のクエリに個別に移動し、バグのあるif / then / elseを修正しました):

List<BTWStudents> students = (from V in db.vwStudentCoursesSD
    where classIds.Contains(V.Class.Value)
    select new {V}).Distinct().ToList().Select(x => new BTWStudents
                {
                classId = V.Class.HasValue ? V.Class.Value : 0,
                studentName = V.StudentName,          
                paymentAmount = V.PaymentMethod == "Cashier Check" ? String.Format("{0:c}",x.V.AmountOwed): "0.00"
                }).ToList();
于 2012-06-21T13:59:39.453 に答える
0

StudentIDを使えDistinctばまとめて使えますGroup

var studentsGroupedByPayment =
    (from V in db.vwStudentCoursesSD
    where classIds.Contains(V.Class.Value)
    group V by V.StudentId into groupedV
    select new
    {
        StudentID = groupedV.Key,
        Amount = string.Format("{0:C}",
                      groupedV.First().PaymentMethod == "Cashier Check" ?
                      groupedV.First().Amount : 0.0)
    }
    ).ToList();
于 2012-06-21T17:45:06.080 に答える