c# - 无法将 OneTimeEnumerable 转换为 System.Collections.Generic.List

标签 c# .net linq-to-sql

因此,我目前正在开发一个带有 MSSQL 数据库后端的小型客户端应用程序。

我一直在使用 Linq to 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 是一个用于在单一类型中同时显示 BlacklistEntryDeletedBlacklistEntry 的类,以保持整洁。 (规定删除的条目必须存储在单独的表中)

如果它被认为是相关的,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 类型参数中定义的类型?

提前致谢。

最佳答案

这件事发生在我身上。问题的原因是 ToList在您编译的查询 block 中。编译查询显然只返回 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()

关于c# - 无法将 OneTimeEnumerable 转换为 System.Collections.Generic.List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28989098/

相关文章:

c# - 跨平台国际化

c# - 允许以逗号分隔的数字列表的正则表达式模式是什么?

.net - 即时生成站点地图

c# - 为什么未使用的重载需要项目引用?

c# - 使用 LINQ To SQL 检索新插入的记录 ID

c# - Linq to SQL 和自动映射器

sql - 我将如何在 Linq 中执行此 SQL?

c# - 接口(interface)类型转换类型安全

c# - 代码契约(Contract),如果 X < Y 且 Y = Z+1 为什么 X < Z+1 未被证明

c# - "not all code paths return a value"谁能指出我正确的方向?