LINQを使用してデータベースからレコードをプルしてIQueryableを取得する関数を作成しています。このLINQステートメントは、特定の期間内にアクティブユーザーのすべてのレコードをプルしてから、ユーザーID、名、姓をTelerikRadGridに吐き出します。
私の問題は、このデータをプルするときにUserIDで個別の値を取得しようとすることにあります。結果を得るために、このコードを作り直してみました。これは、Distinctが機能していない状態で、すべてのデータをプルしているコードの例です。
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select c).Distinct();
return Employees;
}
データソースをグリッドに適用した後、これによりユーザーが4回返され、その期間のレコードごとに1つのインスタンスが返されます。
LINQ関数にDistinctを適用して、この機能を意図したとおりに機能させる方法はありますか?
オブジェクトでこれを行うために私が見つけた最も簡単な方法は、groupbyを使用してから最初のものを選択することです。
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select c).GroupBy(g=>g.DataSystem_Employees.AccID).Select(x=>x.FirstOrDefault());
return Employees;
}
これはテストされていませんが、一般的な概念はあります。
編集:私はもともとここのどこかで答えを見つけたことを思い出しました。特定のプロパティでオブジェクトをグループ化するには、これを確認してください。 特定のプロパティに対するLINQのDistinct()
返すオブジェクトを表示したいフィールドだけに制限すると、正しく機能します。
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select c.DataSystem_Employees.FName,
c.DataSystem_Employees.LName,
c.ID).Distinct();
return Employees;
}
選択しているオブジェクトタイプのIEqualityComparer<T>
を記述して、Distinct
メソッドで使用してみてください
オブジェクト内のさまざまなフィールドの名前についていくつかの仮定を立てます。
public static IQueryable GetActiveEmployees_Grid(string Period)
{
DataContext Data = new DataContext();
var Employees = (from c in DataSystem_Records
where c.Period == Period
orderby c.DataSystem_Employees.LName
select new { FirstName = c.DataSystem_Employees.FName, LastName = c.DataSystem_Employees.LName, ID = c.DataSystem_Employees.ID }).Distinct();
return Employees;
}
MVCパターンに従うには、このクエリをモデルにリフトして、それらのフィールドを含む特定のクラスを返すことができます。
これを行うには、Distinct()メソッドを使用します。例えば:
var query = from Notification in db.Notifications
select Notification.client ;
query=query.Distinct();
結果のクエリには、個別の値のみが含まれます。