9

次のことを達成するための正しい構文を見つけるのに問題があります。

LINQ (ラムダ式) を使用して .GroupBy データに変換することは可能ですか? 通常の .Sum() または .Count() を使用する代わりに、結果のデータを Int のリストにしたいと考えています。

Filter_IDs という名前の独自のクラスを定義しました。そのコンストラクターには 2 つのパラメーターが必要です。

public int? type; // Represents the object_type column from my database
public List<int?> objects; // Represents the object_id column from my database

データベースからこのオブジェクトにデータをロードしたいと考えています。次の LINQ クエリは、Filter_ID のリストになります。

次の LINQ クエリは、Filter_ID のリストになります。

List<Filter_IDs> filterids = ef.filterLine
        .GroupBy(fl => fl.objectType)
    .Select(fl => new Filter_IDs { type = fl.Key, objects = fl.Select(x => x.object_id).ToList() })
    .ToList();

このクエリを使用すると、ビルド エラーは発生しませんが、RunTime で「NotSupportedException」が発生します。

データベースは、データをよりよく理解できるように、次のようになります。

http://d.pr/i/mnhq+ (droplr 画像)

前もってありがとう、ゲルベン

4

3 に答える 3

12

問題は、DB が選択で ToList を呼び出すことも、新しい Filter_ID を作成することもできないことだと思います。

このようなことを試してください:

List<Filter_IDs> filterids = ef.filterLine.Select(o => new { objectType = o.objectType, object_id=o.object_id})
    .GroupBy(fl => fl.objectType).ToList()
    .Select(fl => new Filter_IDs { type = fl.Key, objects = fl.Select(x => x.object_id).ToList() })
    .ToList();
于 2012-12-06T14:44:11.863 に答える
1

多分あなたがしたい

IList<Filter_IDs> filterIds = ef.filterline
    .Select(fl => fl.objectType).Distinct()
    .Select(ot => new Filter_IDs
        {
            type = ot,
            objects = ef.filterline
                          .Where(fl => fl.objectType == ot)
                          .Select(fl =>objectType)
                          .ToList()
        }).ToList();

個別のリストobjectTypeを取得し、それを使用して の各リストをサブクエリしますobject_id

ただし、値を順番に列挙する方が効率的だと思われますが、

var results = new List<Filter_IDs>();
var ids = new List<int>();
var first = true;
int thisType;

foreach (var fl in ef.filterLines
                       .OrderBy(fl => fl.objectType)
                       .ThenBy(fl => fl.object_Id))
{
    if (first)
    {
        thisType = fl.objectType;
        first = false;
    }
    else
    {
        if (fl.objectType == thisType)
        {
            ids.Add(fl.object_Id);
        }
        else
        {
           results.Add(new Filter_IDs
                {
                    Type = thisType,
                    objects = ids
                });
           thisType = fl.objectType;
           ids = new List<int>();   
        }
    }    
}
于 2012-12-06T14:49:16.800 に答える
0

クライアント側で GroupBy を使用できます。

List<Filter_IDs> filterids = ef.filterLine
        .Select(fl=>new {fl.ObjectType, fl.object_id})
        .AsEnumerable()
        .GroupBy(fl => fl.objectType)
    .Select(fl => new Filter_IDs { type = fl.Key, objects = fl.Select(x => x.object_id).ToList() })
    .ToList();
于 2012-12-06T14:44:35.020 に答える