Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当试图成为通用型时出现铸造问题/';自由输入';|ASP MVC_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

C# 当试图成为通用型时出现铸造问题/';自由输入';|ASP MVC

C# 当试图成为通用型时出现铸造问题/';自由输入';|ASP MVC,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,问题 有没有一种方法可以在C#(在helper类或其他类中)中只定义一次方法,而不知道返回哪种类型 详细解释 我得到以下错误: Unable to cast object of type 'System.Data.Objects.ObjectQuery`1[WerkStageNu.Vacancies]' to type 'System.Linq.IQueryable`1[WerkStageNu.Models.IFilteredEntities]'. 无法强制转换类型为的对象 System.Da

问题

有没有一种方法可以在C#(在helper类或其他类中)中只定义一次方法,而不知道返回哪种类型

详细解释 我得到以下错误:

Unable to cast object of type 'System.Data.Objects.ObjectQuery`1[WerkStageNu.Vacancies]' to type 'System.Linq.IQueryable`1[WerkStageNu.Models.IFilteredEntities]'.
无法强制转换类型为的对象 System.Data.Objects.ObjectQuery
1[WerkStageNu.expansions]'
打字
'System.Linq.IQueryable
1[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
{
    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和FilterCriteriaHelper和

现在,将执行实际筛选的方法放在另一个帮助器类中: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;
    }
我希望我没有忘记任何信息,但我已经盯着这个代码看了一段时间了。可能会忘记一段关系或其他事情,如果我忘记了,就直接问我:)

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

评论后编辑

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


哦,废话,别担心这部分,我忘了作为一个可计算的部分,仍然在使用AsQueryable。

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

IEnumerable<IFilteredEntities> selectedListings =
    Repository.Instance._entities.Vacancies.AsQueryable()
    .OfType<IFilteredEntities>();
IEnumerable selectedListings=
Repository.Instance.\u entities.dispositions.AsQueryable()
.of type();
这样做的目的是将集合的每个元素投影到IFilteredEntities类型

另一种选择是重写筛选方法,使其使用泛型,如下所示:

public static IEnumerable<T> Filter<T>(
    IEnumerable<T> collection, IDictionary<string, string> filterParams)
    where T : IFilteredEntities
{
    ...
}
公共静态IEnumerable筛选器(
IEnumerable集合、IDictionary筛选器参数)
其中T:iFilteredenties
{
...
}

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

您在这个问题上付出的全部努力获得了额外的分数!非常感谢,在回复中付出同样努力的人将获得加分:)。嗯,什么?我想不是:)。也许你也应该把这个标记为c。这不仅仅是针对ASP.NETMVC的。我认为,Mastermind的意思是monster.com:)我已经在底部编辑了我的文章,其中包含了我在实现此功能后遇到的问题。它确实通过了这一行,但下一部分是:).Wups,还有一个小的附加内容要更改:AsQueryable()为AsEnumerable()。
IEnumerable<IFilteredEntities> selectedListings =
    Repository.Instance._entities.Vacancies.AsQueryable()
    .OfType<IFilteredEntities>();
public static IEnumerable<T> Filter<T>(
    IEnumerable<T> collection, IDictionary<string, string> filterParams)
    where T : IFilteredEntities
{
    ...
}