这是我的代码:
public class Restaurant {
public int ID { get; set; }
public int DOHVisits { get; set; }
public int QtyComplaints { get; set; }
public List<Complaint> Complaints = new List<Complaint>();
}
public class Complaint {
public string Name; { get; set; }
public string Address; { get; set; }
public string Description; { get; set; }
public DateTime ComplaintDate; { get; set; }
}
void Main() {
List<Restaurant> RestaurantData = new List<Restaurant>();
}
我想在DataGridView控件中显示RestaurantData中包含的数据。首先,我想显示餐馆的ID,然后是健康部门(DOHVisits)访问过的次数,然后是投诉数量(QtyComplaints),最后是投诉详情,如果有的话任何。它看起来像这样(ID在列A中,DOHVisits在B列中,等等):
每家餐厅至少有1个DOHVisit。有些餐馆有0个投诉,有些有很多。但在所有情况下,我都希望餐馆的ID只出现一次(如果他们有任何投诉可以跟进)。我以前对DataGridView的使用仅限于dataGridView1.DataSource =(某些数组)。但是,这次我要呈现的信息显然不是一个数组,所以我被卡住了。
var ds = RestaurantData.OrderByDescending(x => x.DOHVisits).SelectMany(Restaurant
=> Restaurant.Complaint.Select((Complaint, index)
=> new
{
ID = index >= 0 ? Restaurant.ID.ToString() : "",
DOHVisits = Restaurant.DOHVisits.ToString(),
QtyComplaints = Restaurant.QtyComplaints.ToString(),
Complaint.Name,
Complaint.Address,
Complaint.Description,
Complaint.ComplaintDate
})).ToList();
dataGridView1 = ds;
上述代码存在的问题是,所有餐馆都没有投诉。我想包括没有投诉的餐厅,并将它们显示在数据网格中。
答案 0 :(得分:1)
首先,我声明实现GridView的每个数据行的类:
class ResultLine
{
public int? ID { get; set; }
public int? DOHVisits { get; set; }
public int? QtyComplaints { get; set; }
public string ComplaintName { get; set; }
public string ComplaintAddress { get; set; }
public string ComplaintDescription { get; set; }
public DateTime? ComplaintDate { get; set; }
}
可以写下查询:
IEnumerable<ResultLine> lines = RestaurantData.OrderByDescending(x => x.DOHVisits)
.SelectMany(r => new List<ResultLine>() {
new ResultLine() {
ID = r.ID,
DOHVisits = r.DOHVisits,
QtyComplaints = r.QtyComplaints,
ComplaintName = null,
ComplaintAddress = null,
ComplaintDescription = null,
ComplaintDate = null
}
}.Concat(r.Complaints.OrderBy(c => c.ComplaintDate).Select(c => new ResultLine() {
ID = null,
DOHVisits = null,
QtyComplaints = null,
ComplaintName = c.Name,
ComplaintAddress = c.Address,
ComplaintDescription = c.Description,
ComplaintDate = c.ComplaintDate
})));