#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 }
Затем вы можете полностью удалить явное приведение