尝试通用/“类型自由”时的转换问题 | 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 的相关文章

随机推荐

  • 如何从另一个网站抓取特定 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