GroupBy
Update を使用した新しいソリューション:
実際には、はるかに簡単なソリューションがあります。
IList<Project> projects = (from update in dbContext.TicketUpdates where update.TicketUpdatesEmployeeID == Profile.EmployeeID)
.GroupBy(tu=>tu.Ticket.Project)
.Select(group=>group.First())
.OrderByDescending(tu=>tu.TicketUpdatesEndDate)
.Select(tu=>tu.Ticket.Project)
.ToList();
(そして、これを書いているときに、他の人が同様の回答を投稿しているのを見ました)
カスタム IEqualityComparer を使用した古いソリューション(これが linq2sql で機能するかどうかはわかりません)
カスタム IEqualityComparer を取る Distinct オーバーロードがあります。したがって、データを投影する前に、カスタム IEqualityComparer を使用して TicketUpdates に対して Distinct を実行します。
IEqualityComparer は、同じプロジェクトを持っている場合、すべての TicketUpdates を等しいものとしてカウントする必要があります。そうすれば、同じプロジェクトを持つ TicketUpdates は破棄されます。
(同じプロジェクトのどのTicketUpdates が破棄されるかを制御しないことに注意してください。したがって、同じプロジェクトのこれらの TicketUpdates の EndDates が異なる場合は、代わりに GroupBy を含むソリューションが必要になります。
IList<Project> projects = (from update in dbContext.TicketUpdates where update.TicketUpdatesEmployeeID == Profile.EmployeeID)
.Distinct(new ProjectComparer())
.OrderByDescending(tu=>tu.TicketUpdatesEndDate)
.Select(tu=>tu.Ticket.Project)
.ToList();
// Your comparer should look somewhat like this
// (untested code! And I do not know all the details about your class structure)
class ProjectComparer : IEqualityComparer<TicketUpdates>
{
// Products are equal if their names and product numbers are equal.
public bool Equals(TicketUpdates x, TicketUpdates y)
{
//Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y)) return true;
//Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
//Check whether projects are equal.
//(perhaps do a null check for Ticket!)
return x.Ticket.Project== y.Ticket.Project;
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public int GetHashCode(TicketUpdates x)
{
//Check whether the object is null
if (Object.ReferenceEquals(x, null)) return 0;
// null check for Ticket and Project?
return x.Ticket.Project.GetHashCode();
}
}