LINQ Lambda, Группа с список
У меня возникли проблемы с поиском правильного синтаксиса для выполнения следующего:
Возможно ли с LINQ (лямбда-выражение) для данных.GroupBy и вместо того, чтобы использовать обычные.Sum() или.Count(), я хочу, чтобы результирующие данные были списком Int.
Я определил свой собственный класс с именем: Filter_IDs. Его конструктору нужны два параметра:
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();
Использование этого запроса не приводит к ошибке построения, но дает исключение NotSupportedException в RunTime.
База данных выглядит так, чтобы дать вам лучшее понимание данных:
http://d.pr/i/mnhq+ (изображение droplr)
Заранее спасибо, Гербен
3 ответа
Я думаю, что проблема в том, что БД не может ни вызывать ToList в select, ни создавать новый 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();
Может ты хочешь
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>();
}
}
}
Вы можете использовать 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();