Невозможно привести 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()
Другие вопросы по тегам