web-dev-qa-db-ja.com

LINQで個別のIQueryableを返しますか?

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つのインスタンスが返されます。

alt text

LINQ関数にDistinctを適用して、この機能を意図したとおりに機能させる方法はありますか?

14
Lando

オブジェクトでこれを行うために私が見つけた最も簡単な方法は、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()

24
Gage

返すオブジェクトを表示したいフィールドだけに制限すると、正しく機能します。

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;
}
6
sgriffinusa

選択しているオブジェクトタイプのIEqualityComparer<T>を記述して、Distinctメソッドで使用してみてください

4
Dean Chalk

オブジェクト内のさまざまなフィールドの名前についていくつかの仮定を立てます。

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パターンに従うには、このクエリをモデルにリフトして、それらのフィールドを含む特定のクラスを返すことができます。

2
Lazarus

これを行うには、Distinct()メソッドを使用します。例えば:

var query = from Notification in db.Notifications

                        select Notification.client ;
            query=query.Distinct();

結果のクエリには、個別の値のみが含まれます。