0

在此处输入图像描述

第一个表是视图,第二个是我想要的结果

下面的查询工作正常

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 以添加字符串格式(见下文)

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();

通过第二个查询,我得到了这个

在此处输入图像描述

为什么 distinct 在第二个查询中不起作用?

4

3 回答 3

0

试试这个(将您的 distinct 移至第一个查询并纠正您的错误 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

使用对象时(在您的情况下是包装的匿名类型,因为您使用的是 Select new {V} 而不仅仅是 Select V),Distinct 在进行比较时调用 object.Equals 。在内部,这会检查对象的哈希码。您会发现在这种情况下,即使字段包含相同的值,两个对象的哈希码也不同。要解决此问题,您需要覆盖对象类型上的 Equals 或将自定义 IEqualityComparer 实现传递给 Distinct 重载。您应该能够在线搜索“Distinct IEqualityComparer”找到许多示例。

于 2012-06-21T17:15:44.867 回答
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 回答