1

最初に Entity Framework コードを使用する Web アプリケーションがあり、以下のサンプル データを ASP.NET のさまざまなエンティティ データ対応コントロールに接続できるようにしたいと考えています。

コントロールの ItemType プロパティを使用してカスタムカプセル化クラスを指定し、コントロールの SelectMethod プロパティを使用して LINQ クエリを呼び出すことにより、コントロールが使用できる IQueryable コレクションを返す必要があり、自動ページネーションなどで動作します。

開始するエンティティがあると仮定しましょう:-

public class MyEntity
{
    [Key]
    public int MyObjectId { get; set; }
    public string Name { get; set;}
}

したがって、このLINQクエリは正常に機能します

public IQueryable<MyObject> GetMyObjects()
{
    SiteContext db = new SiteContext();

     var myObjects = (from m in db.MyObjects
                        select m);

    return myObjects;
}

現在、次のサンプルデータを使用しています:-

MyObjectId  Name
1   Apple
2   Orange
3   Apple
4   Apple
5   Pear
6   Orange
7   Apple
8   Grapes
9   Apple
10  Orange

私がやりたいことは、データをグループ化し、次のようなカウントを提供することです:-

Name    Count
Apple   5
Orange  3
Pear    1
Grapes  1

したがって、私の最初のステップは、エンティティをカプセル化し、追加のカウント列を提供するクラスを作成することです:-

public class MyObjectWithCount
{
    public MyObject MyObject { get; set; }
    public int Count { get; set; }
}

今、LINQ クエリでいくつかの結果を取得したい

public IQueryable<MyObjectWithCount> GetMyObjectsWithCount()
{
    SiteContext db = new SiteContext();

     var myObjects = (from m in db.MyObjects
                      group m by m.Name into grouped
                      select new MyObjectWithCount()
                      {
                          MyObject = grouped,
                          Count = ?what goes here?
                      });

    return myObjects;
}

したがって、select new MyObjectWithCount() には2つの問題があります

1) グループ化された各アイテムの数を取得するにはどうすればよいですか

2) グループ化されたオブジェクトを Myobject に変換するにはどうすればよいですか。現状では、type system.linq.grouping を MyObject に暗黙的に変換できないという設計時のエラーが発生します。

LINQ クエリでグループ化を実行しなかった場合、IQueryable をコントロールに正常に返すことができ、すべて正常に接続されます (ただし、この段階では明らかにカウントが欠落しています)。

また、明確にするために、これは私のエンティティ/クラスの単純化された例です。実際には、上記の例のように名前フィールドだけでなく、多くのフィールドがあるため、完全な MyObject エンティティにアクセスする必要があります。

あなたが提供できるどんな助けにも感謝します

4

2 に答える 2

0

あなたSelectは少しずれています。

また、戻り値の型がIQueryable<MyObjectWithCount>addであるためAsQueryableです。

編集:コメントから、クラス内のアイテムも返したい場合は、次のことを行う必要があります。

MyObjectWithCount一致するプロパティを保持する別のプロパティと、検索対象の名前を含む文字列を追加します。

public string Name { get; set; }
public List<MyObject> MatchingObjects { get; set; }

次に、それを処理するCountことができます:

public int Count
{
    get
    {
        return MatchingObjects.Count;
    }
}

次に、LINQ は次のようになります。

var myObjects = (from m in db.MyObjects
                  group m by m.Name into grouped
                  select new MyObjectWithCount
                  {
                      Name = grouped.Key,
                      MatchingObjects = grouped.ToList()
                  }).AsQueryable();
于 2013-05-30T15:25:16.480 に答える