#c# #linq
#c# #linq
Вопрос:
public IEnumerable<XdbActiveDiscipline> GetAllDisciplineDocs(string projectNumber)
{
try
{
// return _MigratorDBContext.XdbActiveDiscipline.Where(x => x.OtProjectNumber == projectNumber amp;amp; x.IsProcessed==null).ToList();
var val = _MigratorDBContext.XdbActiveDiscipline.Where(x => x.OtProjectNumber == projectNumber amp;amp; x.IsProcessed == null).OrderBy(x => x.DocumentReference).GroupBy(x => new { x.DocumentReference, x.DocumentRevisionNumber, x.DocumentRevisionObject })
.Select(g => new { g, count = g.Count() })
.SelectMany(t => t.g.Select(b => b)
.Zip(Enumerable.Range(1, t.count), (j, i) => new
{
j.OtProjectNumber,
rn = i
}))
.ToList();
return val;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
возвращает значение: выдает ошибку
И код написан для добавления rownumber()
значения в конце результирующего набора (т.е. разбиения на)
Комментарии:
1. VAL ЯВЛЯЕТСЯ АНОНИМНЫМ, а не XdbActiveDiscipline. измените его на: .Zip(перечисляемый. Диапазон (1, т.е. количество), (j, i) => новый xdbactivedisciplineдисциплина(){…….
2. Ваш метод ожидает конкретный тип в вашем
IEnumerable
, но вы возвращаетеanonymous
тип, используяnew {}
3. примечание; если ваш метод возвращает an
IEnumerable<something>
, нет необходимости вызыватьToList()
результат запроса: пусть вызывающий объект сделает это, если это необходимо.
Ответ №1:
Val — это список анонимов, а не список < XdbActiveDiscipline > . Измените возврат действия на это:
return val.Select( i=> new XdbActiveDiscipline{
Id=i.Id,
.... and so on
}).ToArray();
Ответ №2:
Возвращаемое значение не typeof(XdbActiveDiscipline)
является . Как вы можете видеть, в сообщении об ошибке указано missing a cast?
, что метод ожидает IEnumerable
XdbActiveDiscipline
возврата.
Элемент, который вы выбираете в linq
запросе, имеет анонимный тип, отличный от ожидаемого возврата, это можно увидеть, если навести указатель мыши на значение при создании экземпляра.