Невозможно привести OneTimeEnumerable к System.Collections.Generic.List
Итак, в настоящее время я работаю над небольшим клиентским приложением с базой данных MSSQL.
Я использовал Linq для SQL, и в нем CompiledQuery
, Тем не менее, при получении списка объектов из базы данных, я получаю InvalidCastException
с сообщением:
Unable to cast object of type 'OneTimeEnumerable`1[DiallerBlacklistManager.Data.Entities.BlacklistDataContext.BlacklistEntry]' to type 'System.Collections.Generic.List`1
Это первый раз, когда я сталкиваюсь с этой ошибкой, и я немного растерялся относительно того, что она имеет в виду.
Мой скомпилированный запрос Func выглядит так:
public static Func<BlacklistDataContext, DateTime, DateTime, List<BlacklistEntry>>
GetBlacklistEntriesByBlacklistDateRangeFunc =
CompiledQuery.Compile<BlacklistDataContext, DateTime, DateTime, List<BlacklistEntry>>(
(db, startTime, endTime) =>
(from BlacklistEntry e in db.BlacklistEntries
where e.BlacklistDate >= startTime && e.BlacklistDate <= endTime
select e).ToList());
И метод, который вызывает это:
public List<BlacklistEntryDisplayItem> DoSearch(string searchText, DateTime startTime, DateTime endTime,
bool includeDeleted)
{
List<BlacklistEntryDisplayItem> output = new List<BlacklistEntryDisplayItem>();
if (!string.IsNullOrEmpty(searchText))
{
output.AddRange(GetBlacklistEntriesBySearchAndDateRange(searchText, startTime, endTime).Select(be => (BlacklistEntryDisplayItem) be));
if (includeDeleted)
{
output.AddRange(
GetDeletedBlacklistEntriesBySearchAndDateRange(searchText, startTime, endTime)
.Select(be => (BlacklistEntryDisplayItem) be));
}
}
else
{
output.AddRange(GetBlacklistEntriesByDateRange(startTime, endTime).Select(be => (BlacklistEntryDisplayItem)be));
if (includeDeleted)
{
output.AddRange(
GetDeletedBlacklistEntriesByBlacklistDateRange(startTime, endTime)
.Select(be => (BlacklistEntryDisplayItem) be));
}
}
return output;
}
Обратите внимание, что BlacklistEntryDisplayItem
это класс, используемый для отображения обоих BlacklistEntry
а также DeletedBlacklistEntry
в одном виде, для аккуратности. (Было указано, что удаленные записи должны храниться в отдельной таблице)
В случае, если это считается актуальным, BlacklistEntryDisplayItem
класс это:
public class BlacklistEntryDisplayItem
{
public BlacklistEntryDisplayItem(int id, string phoneNumber, DateTime blacklistDate, string comments, int userId, bool deleted)
{
Id = id;
PhoneNumber = phoneNumber;
BlacklistDate = blacklistDate;
Comments = comments;
UserId = userId;
Deleted = deleted;
}
public int Id { get; private set; }
public string PhoneNumber { get; private set; }
public DateTime BlacklistDate { get; private set; }
public string Comments { get; set; }
public int UserId { get; private set; }
public bool Deleted { get; set; }
public static implicit operator BlacklistEntryDisplayItem(BlacklistEntry entry)
{
return new BlacklistEntryDisplayItem(
entry.Id,
entry.PhoneNumber,
entry.BlacklistDate,
entry.Comments,
entry.UserId,
false);
}
public static implicit operator BlacklistEntryDisplayItem(DeletedBlacklistEntry entry)
{
return new BlacklistEntryDisplayItem(
entry.Id,
entry.PhoneNumber,
entry.BlacklistDate,
entry.Comments,
entry.UserId,
true);
}
}
Кто-нибудь может посоветовать, что OneTimeEnumerable
и почему набор результатов не относится к типу, определенному в параметрах типа Func?
Заранее спасибо.
1 ответ
Это случилось со мной раньше. Причиной проблемы является ToList
в вашем скомпилированном блоке запроса. Скомпилированные запросы видимо только возвращают OneTimeEnumerable<T>
вместо List<T>
, Удалить ToList
и ваш возвращенный скомпилированный запрос IEnumerable<BlacklistEntry>
вместо этого, а затем позвоните ToList
после вызова скомпилированного запроса.
public static Func<BlacklistDataContext, DateTime, DateTime, IEnumerable<BlacklistEntry>>
GetBlacklistEntriesByBlacklistDateRangeFunc =
CompiledQuery.Compile<BlacklistDataContext, DateTime, DateTime, List<BlacklistEntry>>(
(db, startTime, endTime) =>
from BlacklistEntry e in db.BlacklistEntries
where e.BlacklistDate >= startTime && e.BlacklistDate <= endTime
select e);
и затем используйте это так:
GetBlacklistEntriesByBlacklistDateRangeFunc(dataContext, startTime, endTime).ToList()