¿Cómo lidiar con muchos valores posibles para hacer una consulta?

Estoy creando una aplicación MVC en la que el usuario tendrá la posibilidad de usar muchos filtros para obtener exactamente lo que quiere.

Aquí hay una visión general de esos filtros basados ​​en el método del controlador:

//
// GET: /Card/SearchIndex
public ActionResult SearchIndex(string objName, string objType, string objCostSymbol, string objCost, string powerSymbol,
                                        string powerValue, string ratingSymbol, string ratingValue, string ownerName, string objSet, 
                                        string objRarity, string addCostValue, int? objNumber,
                                        string addCostValue2, string addCostValue3, string addCostValue4, string addCostValue5, string addCostValue6,
                                        bool? blueColor, bool? redColor, bool? yellowColor, bool? purpleColor, bool? greyColor, bool? blackColor,
                                        bool? musicColor, bool? allColor)
        {
             // MORE CODE HERE...
        }

Quiero saber cómo sería la mejor manera de lidiar con todos estos filtros, y cómo podría obtener una Lista de objInfo basada en los parámetros dados. Tenga en cuenta que algunos valores pueden ser nulos. Todo lo que he hecho hasta ahora es cargar "todo" el objInfo que podría, luego ordenarlos eliminando el elemento no deseado, que en mi sentido es "no inteligente", pero soy nuevo en la aplicación MVC y Estoy tratando de encontrar una mejor manera de hacer esto.

EDITAR

Aquí está la vista que genera los datos:

@using System.Web.Mvc.Html
@model PagedList.IPagedList<MvcApp.Models.ObjInfo>

@{
    ViewBag.Title = "SearchIndex";
}

<h2>Objects Management</h2>

<p>
    @Html.ActionLink("Create New Obj", "Create")
    @using (Html.BeginForm()){
        <p>
            <label>
                Obj Colors : Check a box to search for a color.
            </label>
            All: @Html.CheckBox("allColor", true)<br/>
            Blue: @Html.CheckBox("blueColor", true)
            Red: @Html.CheckBox("redColor", true)
            Yellow: @Html.CheckBox("yellowColor", true) <br/>
            Purple: @Html.CheckBox("purpleColor", true)
            Grey: @Html.CheckBox("greyColor", true)
            Black: @Html.CheckBox("blackColor", true)
            Music: @Html.CheckBox("musicColor", true)
        </p>
        <p>
            <label>
                Obj Values: Select a value in the list below.
            </label>
            Obj Number: <input type="number" min="0" max="9999" name="cardNumber" value="int" style="width: 70px"/><br/>
            Additional Cost (contains): @Html.DropDownList("addCost", String.Empty) + @Html.DropDownList("addCost2", String.Empty)
            + @Html.DropDownList("addCost3", String.Empty) + @Html.DropDownList("addCost4", String.Empty)
            + @Html.DropDownList("addCost5", String.Empty) + @Html.DropDownList("addCost6", String.Empty)  <br/>
            Cost: @Html.DropDownList("objCostSymbol", "=") @Html.DropDownList("objCost", String.Empty)<br />
            Power: @Html.DropDownList("powerSymbol", "=") @Html.DropDownList("powerValue", String.Empty)<br/>
            Rating: @Html.DropDownList("ratingSymbol", "=") @Html.DropDownList("ratingValue", String.Empty)<br />
            <label>
                Obj Text: Write a name, part of a name, or a word.
            </label>
            Obj Name: @Html.TextBox("objName") <br/>
            Owner: @Html.TextBox("ownerName") <br />
            <label>
                Obj Categories: Select a category in the list below.
            </label>
            Type: @Html.DropDownList("objType","All") <br/>
            Obj Set: @Html.DropDownList("objSet", "All") <br/>
            Rarity: @Html.DropDownList("objRarity", "All")<br />
            <div class="float-right">
                <input type="submit" value="Filter" name="submitbutton">
            </div>
        </p>
    }
</p>
<span style="color:red; font-size: 1.7em; font-style: italic;">@ViewData["ErrorMessage"]</span>
<table>
    <tr>
        <th>Obj Name</th>
        <th>Obj Number</th>
        <th>Obj Color</th>
        <th>Additional Cost</th>
        <th>Cost</th>
        <th>Obj Type</th>
        <th>@Html.ActionLink("Power", "SearchIndex", new {sortOrder=ViewBag.PowerSortParm})</th>
        <th>@Html.ActionLink("Rating", "SearchIndex", new {sortOrder=ViewBag.RatingSortParm})</th>
        <th>Rarity</th>
        <th>Obj Set Name</th>
        <th>Owner Name</th>
        <th></th>
    </tr>

    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjNumber)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjColor)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjAddCost)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjCost)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjType)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjPower)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjRating)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjRarity)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjSet.m_ObjSetName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjOwner)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.m_ObjID }) |
                @Html.ActionLink("Details", "Details", new { id=item.m_ObjID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.m_ObjID })
            </td>
        </tr>
    }
</table>

<div>
    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
    of @Model.PageCount

    @if (Model.HasPreviousPage)
    {
        @Html.ActionLink("<<", "SearchIndex", new {page = 1, sortOrder = ViewBag.CurrentSort})
        @Html.Raw(" ")
        @Html.ActionLink("< Prev", "SearchIndex", new {page = Model.PageNumber - 1, sortOrder = ViewBag.CurrentSort})
    }
    else
    {
        @:<<
        @Html.Raw(" ");
        @:< Prev
    }

    @if (Model.HasNextPage)
    {
        @Html.ActionLink("Next >", "SearchIndex", new {page = Model.PageNumber + 1, sortOrder = ViewBag.CurrentSort})
        @Html.Raw(" ")
        @Html.ActionLink(">>", "SearchIndex", new {page = Model.PageCount, sortOrder = ViewBag.CurrentSort})
    }
    else
    {
        @:Next >
        @Html.Raw(" ")
        @:>>
    }
</div>

Cualquier consejo me ayudará a hacer un mejor trabajo, gracias.

Respuestas a la pregunta(3)

Su respuesta a la pregunta