Не удается преобразовать анонимный тип system.generic.list

#c# #linq

Вопрос:

У меня есть класс, который я хочу заполнить из запроса Linq, но я использую оператор sub select, чтобы немного изменить свойства списка. У меня есть класс, в который он должен вписаться, но он отказывается входить. Мне интересно, есть ли способ, которым я могу заставить эти результаты вписаться в список, как я его определил, а не в общий анонимный тип.

 public class SCADA_DATA_Truncated  {  public string acode { get; set; }  public string LOCCODE { get; set; }  public Nullablelt;System.DateTimegt; COLDATE { get; set; }  public string RESULT { get; set; }  public string analyte { get; set; }     }   

И вот здесь я пытаюсь заполнить данные:

 Listlt;SCADA_DATA_Truncatedgt; dataResults = (SCADA_DATA_Truncated)(from b in a2Entity.SCADA_DATA  where DbFunctions.TruncateTime(b.COLDATE) gt;= dateCheck1 amp;amp; DbFunctions.TruncateTime(b.COLDATE) lt;= dateCheck2  amp;amp; whereInAcode.Contains(b.acode) amp;amp; whereInLoc.Contains(b.LOCCODE)  select new  {  COLDATE = DbFunctions.TruncateTime(b.COLDATE),  acode = b.acode,  LOCCODE = b.LOCCODE,  RESULT = b.RESULT,  analyte = b.analyte  }  ).ToList();  

Комментарии:

1. Что ты собираешься делать select new SCADA_DATA_Truncated { ... } ? И снимите гипс.

2. Вам нужно поставить SCADA_DATA_Truncated после select new ; нет необходимости в гипсе и т. Д., Также можно var dataResults . Если некоторые элементы в фигурных скобках не могут быть напрямую назначены типам свойств в SCADA_DATA_Truncated, вы можете преобразовать их на месте

3. Также, возможно, подумайте о том, чтобы НЕ сокращать время в where; манипулирование табличными данными в предложении where обычно приводит к катастрофе с точки зрения производительности, поскольку это может исключить использование индексов. Лучше просто поискать диапазон, например b.COLDATE gt;= startDate amp;amp; b.COLDATE lt; midnightOnTheDayAfterEndDate , если вы хотите, например, все, что произошло в январе, тогда вы datecol gt;= '2021-01-01' and datecol lt; '2021-02-01' не ищете cast(datecol as date) gt;= '2021-01-01' and cast(datecol as date) lt;= '2021-01-31'

Ответ №1:

Это анонимный тип:

 select new  {  COLDATE = DbFunctions.TruncateTime(b.COLDATE),  acode = b.acode,  LOCCODE = b.LOCCODE,  RESULT = b.RESULT,  analyte = b.analyte }  

Среда выполнения понятия не имеет, как преобразовать ее в ваш класс

Почему бы не изменить его на

 select new SCADA_DATA_Truncated {  COLDATE = DbFunctions.TruncateTime(b.COLDATE),  acode = b.acode,  LOCCODE = b.LOCCODE,  RESULT = b.RESULT,  analyte = b.analyte }  

Затем вы можете полностью удалить явное приведение