尝试通用/“类型自由”时的转换问题 | ASP MVC

2023-12-28

Question

有没有办法在 C# 中(在辅助类或其他类中)只定义一次方法,而不知道要返回哪种类型?

长解释我收到以下错误:

无法转换类型的对象 系统.数据.对象.ObjectQuery1[WerkStageNu.Vacancies]' to type 'System.Linq.IQueryable1[WerkStageNu.Models.IFilteredEntities]'。

我有一个 ListingsController,它可以搜索数据库中当前的职位空缺:

public ActionResult Search(int? page, string branchid, string hoursago, string jobtypeid, string educationlevelid, string careerlevelid)
    {
        string searchResult = string.Empty;
        const int pageSize = 10;

        IQueryable<IFilteredEntities> selectedListings = (IQueryable<IFilteredEntities>)Repository.Instance._entities.Vacancies.AsQueryable();

        Dictionary<string, string> filterParams = new Dictionary<string, string>() {
            {"branchid", branchid}, {"hoursago", hoursago}, {"jobtypeid", jobtypeid}, {"educationlevelid", educationlevelid}, {"careerlevelid", careerlevelid}};

        selectedListings = FilterByIDHelper.Filter(selectedListings, filterParams);

        var paginatedDinners = new PaginatedList<Vacancies>(((IQueryable<Vacancies>)selectedListings).ToList(), page ?? 0, pageSize);
        return View("Index", paginatedDinners);

    }

现在,此搜索仅针对职位空缺。但可以想象我们在各处进行搜索,通常都是相同的例程,所以我想调用相同的方法来返回不同的类型。对于这种情况,我创建了一个 Interface , IFilteredEntities。在我的部分类空缺(部分类,类空缺是由我的数据库实体框架生成)中,我只是这样做:

public partial class Vacancies : IFilteredEntities

当然还要实现接口中默认未实现的方法。在我的界面中我有:

    interface IFilteredEntities
{
    string EducationLevelID { get; set; }
    string BrancheID { get; set; }
    string CareerLevelID { get; set; }
    string JobTypeID { get; set; }

    Branches Branches { get; set; }
    DateTime? DateOfCreation { get; set; }
    CareerLevels CareerLevels { get; set; }
    JobTypes JobTypes { get; set; }
    EducationLevels EducationLevels { get; set; }
}

为了方便起见,我上传了两个帮助器类PaginatedList和FilterCriteria Helperhere http://www.bastijn.nl/zooi/PaginatedList.cs and here http://www.bastijn.nl/zooi/FilterCriteriaHelper.cs.

现在,执行实际过滤的方法被放置在另一个帮助器类中:FilterByIDHelper.cs。

 public static IQueryable<IFilteredEntities> Filter(IQueryable<IFilteredEntities> collection, Dictionary<string, string> filterParams)
    {
        if (filterParams.ContainsKey("branchid")) collection = FilterByBranchId(collection, filterParams["branchid"]);
        if (filterParams.ContainsKey("hoursago")) collection = FilterByHoursAgo(collection, filterParams["hoursago"]);
        if (filterParams.ContainsKey("jobtypeid")) collection = FilterByJobTypeId(collection, filterParams["jobtypeid"]);
        if (filterParams.ContainsKey("educationlevelid")) collection = FilterByEducationLevelId(collection, filterParams["educationlevelid"]);
        if (filterParams.ContainsKey("careerlevelid")) collection = FilterByCareerLevelId(collection, filterParams["careerlevelid"]);

        return collection;
    }

public static IQueryable<IFilteredEntities> Filter(IQueryable<IFilteredEntities> collection, Dictionary<string, string> filterParams)
    {
        if (filterParams.ContainsKey("branchid")) collection = FilterByBranchId(collection, filterParams["branchid"]);
        if (filterParams.ContainsKey("hoursago")) collection = FilterByHoursAgo(collection, filterParams["hoursago"]);
        if (filterParams.ContainsKey("jobtypeid")) collection = FilterByJobTypeId(collection, filterParams["jobtypeid"]);
        if (filterParams.ContainsKey("educationlevelid")) collection = FilterByEducationLevelId(collection, filterParams["educationlevelid"]);
        if (filterParams.ContainsKey("careerlevelid")) collection = FilterByCareerLevelId(collection, filterParams["careerlevelid"]);

        return collection;
    }

为了方便起见,这里是我的解决方案资源管理器的一部分的图片:

解决方案资源管理器 http://www.bastijn.nl/zooi/solutionexplorer.png http://www.bastijn.nl/zooi/solutionexplorer.png

简而言之:

我尝试做的不是像这样调用:

selectedListings = Repository.Instance._entities.Vacancies.AsQueryable();
Dictionary<string, string> filterParams = new Dictionary<string, string>() {
        {"branchid", branchid}, {"hoursago", hoursago}, {"jobtypeid", jobtypeid}, {"educationlevelid", educationlevelid}, {"careerlevelid", careerlevelid}};

    selectedListings = FilterByIDHelper.Filter(selectedListings, filterParams);

    var paginatedDinners = new PaginatedList<Vacancies>(selectedListings.ToList(), page ?? 0, pageSize);
    return View("Index", paginatedDinners);

使用接口调用显示的变体,因此我只需定义一次“Filter”方法,而不是为所有类/模型定义一次。现在请注意,所有这些都可以编译!问题是我收到以下错误:

Unable to cast object of type 'System.Data.Objects.ObjectQuery`1[WerkStageNu.Vacancies]' to type 'System.Linq.IQueryable`1[WerkStageNu.Models.IFilteredEntities]'.

我希望我没有忘记任何信息,但我已经盯着这段代码一段时间了。可能会忘记某个关系或其他什么,如果我忘记了就问一下:)。

-------------------------------------------------- ---

评论后编辑

-------------------------------------------------- ---

噢,废话,别介意这部分,我忘了作为 AsEnumerable,仍在使用 AsQueryable。


在我看来,这是一个协方差与逆变问题。基本上,一个IQueryable<Vacancies>不是 的子类型IQueryable<IFilteredEntities>,即使 Vacancies 实现了 IFilteredEntities。因此,带有强制转换的行会导致运行时错误。因此,与其进行强制转换,不如尝试这样做:

IEnumerable<IFilteredEntities> selectedListings =
    Repository.Instance._entities.Vacancies.AsQueryable()
    .OfType<IFilteredEntities>();

其作用是将集合的每个元素投影到 IFilteredEntities 类型。

另一种选择是重写过滤器方法,以便它们使用泛型,如下所示:

public static IEnumerable<T> Filter<T>(
    IEnumerable<T> collection, IDictionary<string, string> filterParams)
    where T : IFilteredEntities
{
    ...
}

然后,这将允许您传入包含从 IFilteredEntities 派生的任何类型的集合,并返回相同类型的集合。如果您使用 C# 3,如果编译器可以隐式确定类型参数,您甚至不必指定类型参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试通用/“类型自由”时的转换问题 | ASP MVC 的相关文章

  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 如何对使用 Controller.User 变量的控制器操作进行单元测试?

    我有一个控制器操作 如果用户已经登录 它会自动重定向到新页面 User Identity IsAuthenticated 针对这种情况编写单元测试以确保重定向发生的最佳方法是什么 我一直在使用以下 Mocks 和 Moq 来允许在我的单元测
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • __doPostBack 重新加载整个页面而不仅仅是 UpdatePanel

    在我的 javascript 中 我有以下行 doPostBack MyPanel MyParam 在后面的代码中 我使用 MyParam 查询数据库并将结果绑定到 MyPanel updatepanel 内的 gridview updat
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • JWT - 配置授权服务器并将颁发者设置为其本身

    我正在尝试按照本指南设置授权服务器 http bitoftech net 2014 10 27 json web token asp net web api 2 jwt owin authorization server http bito
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K

随机推荐

  • 如何从另一个网站抓取特定 DIV 并将其加载到我的网站?

    我找了又找 似乎找不到我想要的东西 我不是最擅长 javascript 所以现在我寻求帮助 我用JQuery在我的网站上 我希望能够从类似网站调用 body 或 item 等特定元素NewEgg or Walmart or Bestbuy
  • 帮助 K&R 计算字符示例

    我正在阅读 K R 的第二版 我被这个看似简单的例子难住了 include
  • arraylist并发修改[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在用
  • 交叉连接同一个表中的 N 组行

    我有一个通用的 Dimension 和 DimensionMember 表 CREATE TABLE dbo Dimension ID int NOT NULL IDENTITY 1 1 Label nvarchar 255 CREATE
  • 如何正确访问 RefCell 中的值

    我试着把头扭过来Rc and RefCell在铁锈中 我想要实现的是对同一对象有多个可变引用 我想出了这个虚拟代码 use std rc Rc use std cell RefCell struct Person name String m
  • 权限拒绝:不允许在android中发送广播

    我创建了一个简单的相机应用程序 它在除 Android 4 4 之外的所有 Android 版本中都能正常运行 当我从相机应用程序拍照时出现以下错误 java lang SecurityException Permission Denial
  • 如何在滚动时禁用 TouchableOpacity 的突出显示效果?

  • 如何自定义颜色条

    使用这段代码 我不知道如何自定义颜色栏 关于此的色彩图webiste http matplotlib org users colormaps html不能满足我 shade m contourf Lon Lat TBB np arange
  • Android 中的 ViewPager + RecyclerView 问题

    嗨 我有Tablayout with Viewpager我正在使用Fragment用于表格布局 现在在每个 Tablayout 片段中我都有Recyclerview并显示项目 请查看我的 json 响应 http pastebin com
  • Money_format() 函数的替代方案

    我正在尝试使用money format PHP 中的函数 但出现以下错误 Fatal error Call to undefined function money format 关于此错误的搜索表明该函数money format 仅当系统有
  • 如果我需要额外的 REST API,Meteor 是一个选择吗?

    我要编写一个 Web 应用程序 它应该可以从 Web 和本机移动设备应用程序进行 CRUD 访问 对于后者 我绝对致力于 REST API 通过 Meteor com 可以实现这一点吗 是否可以选择仅将 Meteor 用于 Web 并使用第
  • Python MySQLdb 异常

    刚刚开始掌握 python 和 MySQLdb 并且想知道 在哪里放置 try catch 块来连接 MySQL 是最好的选择 在 MySQLdb connect 点 当我查询时也应该有一个吗 我应该在这些块中捕获哪些异常 谢谢你的帮助 干
  • PHP:比 strtotime 更好的日期解析器

    我正在尝试解析特定格式的字符串 但我很惊讶地发现我找不到一个好的函数来做到这一点 我发现的唯一一个是斯特托时间它不适合它guesses日期格式 我真的不相信 猜测 部分 此外 我的字符串输入是法语格式 dd mm aaaa 这似乎不太容易理
  • 如何禁用 HTML 视频播放器播放速度/三个点

    我不想在视频中显示播放速度 是否有任何控件或controlList属性来禁用该选项 例如controls disablepictureinpicture controlslist nodownload 将参数 noplaybackrate
  • C 和 C++ 标准之间有什么关系?

    我正在写这个答案 https stackoverflow com questions 5539249 why transforms begin s end s begin tolower cant be complied successfu
  • div水平居中和垂直居中[重复]

    这个问题在这里已经有答案了 我想将 div 水平居中和垂直居中对齐body一个页面的 The css loginBody width 100 height 100 margin 0 padding 0 background 999 for
  • 点网组件查看器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 dll 其中包含点网程序集 通用中间语言 问题是它缺乏文档 我需要弄清楚 api 比如可用的类
  • 导出为中文PDF

    我有一个包含中文的网格 当我想将数据导出为 PDF 时出现问题 似乎出现了一个奇怪的字符 下图 或类似的东西 谁能帮我解决这个问题 这里我提供一个dojo中的DEMO https dojo telerik com EJUWoNuB 找到了解
  • 如何将子域指向 Heroku 应用程序,并将根域指向另一个 Heroku 应用程序?

    我在将子域路由到 Heroku 上托管的 Wordpress 博客以及将根域路由到另一个 Heroku 应用程序时遇到问题 如果我购买了一个名为cheese com在 NameCheap 上 我想路由一个子域 例如blog cheese c
  • 尝试通用/“类型自由”时的转换问题 | ASP MVC

    Question 有没有办法在 C 中 在辅助类或其他类中 只定义一次方法 而不知道要返回哪种类型 长解释我收到以下错误 无法转换类型的对象 系统 数据 对象 ObjectQuery1 WerkStageNu Vacancies to ty