Problems with casting when trying to be universal / 'type free' | ASP MVC

Question

Is there a way to define a method only once in C # (in a helper class or something else) without knowing which type will be returned?

Long explanation I get the following error:

Cannot start an object of type System.Data.Objects.ObjectQuery 1[WerkStageNu.Vacancies]' to type 'System.Linq.IQueryable1 [WerkStageNu.Models.IFilteredEntities]. "

I have a PropertyController that searches my current jobs in the database:

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);

    }

. , , , , . , 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 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;
    }

:

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);

, , te Filter, /. , ! , :

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

, - , . - , , :).

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

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

O , , AsEnumerable, AsQueryable.

+4
1

, . , IQueryable<Vacancies> IQueryable<IFilteredEntities>, 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 . # 3, , .

+5

All Articles