使用用户选择的标准填充列表MVC C#

时间:2018-01-11 13:54:57

标签: c# asp.net-mvc linq

我有一张包含大量数据的表格,我允许用户指定他们想要在表格中显示哪些数据(我正在使用多选列表)。

场景示例(以下是一个示例,与我的数据或字段无关,这只是为了简单起见)

我的表包含以下带有数据的列:

FirstName, Surname, DOB, Address1, Address2, Address3, JobPosition, Age

然后,用户可以在年龄范围(例如18-30)和位置类型(接待员)之间进行选择。然后用户选择它想要查看的字段,例如FirstName,Surname,JobPosition,Age(这些存储在字符串数组中) - 现在我的问题是,我只需要在表中显示这些标题及其数据,而不是地址1,2和3。

因此,如果我必须写一个查询它应该是什么样的查询:

SELECT FirstName, Surname, Position, Age, WHERE age between 18 and 30 and JobPosition = 'Receptionist'

我正在使用LINQ和C# - 我有查询和所有设置,看起来像这样:

var query = db.people.where(x=>(x.age >= 18 && x.age <= 30) && x.JobPosition == "Receptionist").ToList();

我如何只浏览那些特别选择的标题并将其显示在我视图中的表格中?

我搜索过高低,但努力寻找我认识的东西应该相对简单。

添加我的实际ActionResult,让您了解我正在做什么

public ActionResult GetReport(ReportKPIViewModel model)
{
    clsReportKPI clsReportKPI = new clsReportKPI();
    List<ReportKPIDetailsViewModel> ReportKPIDetails = new List<ReportKPIDetailsViewModel>(); //This contrains a few specific fields

    try
    {
        var TLGUIDs = clsReportKPI.GetTeamLeaderOpsGUIDs(model.TeamLeadersArray); //This returns The specific selected users GUID's from User Table
        var QAGUIDs = clsReportKPI.GetQualityAuditorGUIDs(model.QualityAuditorsArray); //This returns The specific selected users GUID's from User Table
        var AgentGUIDs = clsReportKPI.GetAgentGUIDs(model.AgentsArray); //This returns The specific selected users GUID's from User Table
        var KPIQAFields = clsReportKPI.GetKPIQAFields(model.KPIArray); //This returns The specific selected fields that the user wants displayed - This is an IENumerable<string>

        var qualityAudit = db.QualityAudits.Where(x => x.AreaId == model.AreaFilterId && TLGUIDs.Contains(x.TeamLeaderOpsId) && QAGUIDs.Contains(x.AuditorId) && AgentGUIDs.Contains(x.AgentId)).ToList(); //This is returning all data in the table related to the criteria the user selected

        foreach(var item in qualityAudit)
        {
            ReportKPIDetailsViewModel RKPI = new ReportKPIDetailsViewModel();

            RKPI.Date = item.QualityAuditDate;
            RKPI.AreaName = item.Area.AreaName;
            RKPI.TeamLeader = db.Users.FirstOrDefault(x => x.Id == item.TeamLeaderOpsId).FullName;
            RKPI.QualityAuditor = db.Users.FirstOrDefault(x => x.Id == item.AuditorId).FullName;
            RKPI.Agent = item.Agent.FirstName.ToString() + " " + item.Agent.LastName.ToString();

            ReportKPIDetails.Add(RKPI);
        }

        model.KPIColumnNames = KPIQAFields; // These are the columns the user selected
        model.ReportKPIDetails = ReportKPIDetails;

        return PartialView("_partialReports", model);
    }
    catch (Exception ex)
    {
        //model.ReportKPIDetails = ReportDetailsList;

        return PartialView("_partialReports", model);
    }
}

3 个答案:

答案 0 :(得分:1)

根据您希望使用数据的方式,您需要将数据投影到强类型对象中,或者如果幸运的话,您可以使用动态类型。

var query = db.people.where(x=>(x.age >= 18 && x.age <= 30) && x.JobPosition == "Receptionist").Select(a=> new {FirstName =a.FirstName, LastName = a.LastName, Age = a.age, JobPosition = a.JobPosition}).ToList();

选择的投射应该照顾它。

我不知道你的类或对象是怎样的,所以你必须使用适当的属性命名来修复代码。

希望这有帮助。

答案 1 :(得分:0)

您可以创建ODataController

public class PeopleController : ODataController
{
    [EnableQuery]
    public IQueryable<People> Get()
    {
        return db.people.AsQueryable();
    }
}

您可以指定要选择的字段列表:

GET /People?$select=FirstName,Surname,Age

您将收到类似的答复:

{
    "odata.metadata": "http://localhost/odata/$metadata#People&$select=FirstName,Surname,Age",
    "value": [
        { "FirstName": "FirstNameOne", "Surname": "SurnameOne", "Age": 42 },
        { "FirstName": "FirstNameTwo","Surname": "SurnameTwo","Age": 53 },
        ...
    ]
}

有关OData的更多信息,请访问here

答案 2 :(得分:0)

首先,感谢所有通过评论并尝试帮助的人!由于我的问题格式,我期待一个更不友好/更有帮助的回复。

然而,我找到了解决问题的方法。为了快速描述我的所作所为:

  • 通过前端收集所有条件并传递给我的Linq查询并将表格中的所有数据拉入List&lt;&gt;
  • 创建了一个转换我的List&lt;&gt;的函数到DataTable(这里我指定了我想要显示的强制字段以及用户选择的字段,以了解要放入数据表中的数据。
  • 我转到了我的视图并显示了信息。

我知道这是相对习惯的,但也许它可以帮助别人。以下是我的所有代码:

<强>控制器: //这是点击提交按钮后点击的动作

public ActionResult GetReport(ReportKPIViewModel model)
        {
            clsReportKPI clsReportKPI = new clsReportKPI();
            List<ReportKPIDetailsViewModel> ReportKPIDetails = new List<ReportKPIDetailsViewModel>();
            List<string> CompulsaryFields = new List<string>();

            CompulsaryFields.Add("Date");
            CompulsaryFields.Add("AreaName");
            CompulsaryFields.Add("TeamLeaderName");
            CompulsaryFields.Add("QualityAuditorName");
            CompulsaryFields.Add("AgentName");

            try
            {
                var TLGUIDs = clsReportKPI.GetTeamLeaderOpsGUIDs(model.TeamLeadersArray);
                var QAGUIDs = clsReportKPI.GetQualityAuditorGUIDs(model.QualityAuditorsArray);
                var AgentGUIDs = clsReportKPI.GetAgentGUIDs(model.AgentsArray);
                var KPIQAFields = clsReportKPI.GetKPIQAFields(model.KPIArray);

                var qualityAudit = db.QualityAudits.Where(x => (DbFunctions.TruncateTime(x.QualityAuditDate) >= DbFunctions.TruncateTime(model.ReportDateFrom) && DbFunctions.TruncateTime(x.QualityAuditDate) <= DbFunctions.TruncateTime(model.ReportDateTo)) &&  x.AreaId == model.AreaFilterId && TLGUIDs.Contains(x.TeamLeaderOpsId) && QAGUIDs.Contains(x.AuditorId) && AgentGUIDs.Contains(x.AgentId)).ToList();

                foreach (var item in qualityAudit)
                {
                    item.Date = item.QualityAuditDate;
                    item.AreaName = item.Area.AreaName;
                    item.TeamLeaderName = db.Users.FirstOrDefault(x => x.Id == item.TeamLeaderOpsId).FullName;
                    item.QualityAuditorName = db.Users.FirstOrDefault(x => x.Id == item.AuditorId).FullName;
                    item.AgentName = item.Agent.FirstName.ToString() + " " + item.Agent.LastName.ToString();
                }

                DataTable dt = LINQToDataTable(qualityAudit, CompulsaryFields, KPIQAFields);

                model.KPIColumnNames = KPIQAFields;
                model.ReportKPIDetails = ReportKPIDetails;
                model.dtReportDetails = dt;

                return PartialView("_partialReports", model);
            }
            catch (Exception ex)
            {
                //model.ReportKPIDetails = ReportDetailsList;

                return PartialView("_partialReports", model);
            }
        }

//这是用于转换我的List&lt;&gt;的函数到数据表:

public DataTable LINQToDataTable<T>(IEnumerable<T> varlist, List<string> CompulsaryFields, IEnumerable<string> QAFields)
        {
            DataTable dtReturn = new DataTable();
            // column names 
            PropertyInfo[] oProps = null;

            if (varlist == null) return dtReturn;

            foreach (T rec in varlist)
            {
                // Use reflection to get property names, to create table, Only first time, others 
                //will follow
                if (oProps == null)
                {
                    oProps = ((Type)rec.GetType()).GetProperties();
                    foreach (PropertyInfo pi in oProps)
                    {
                        Type colType = pi.PropertyType;

                        if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
                        == typeof(Nullable<>)))
                        {
                            colType = colType.GetGenericArguments()[0];
                        }

                        foreach(var item in CompulsaryFields)
                        {
                            if (pi.Name == item)
                            {
                                dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                            }
                        }

                        foreach (var item in QAFields)
                        {
                            if (pi.Name == item)
                            {
                                dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                            }
                        }
                    }
                }

                DataRow dr = dtReturn.NewRow();

                foreach (PropertyInfo pi in oProps)
                {
                    foreach (var item in CompulsaryFields)
                    {
                        if (pi.Name == item)
                        {
                            dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue(rec, null);
                        }
                    }

                    foreach (var item in QAFields)
                    {
                        if (pi.Name == item)
                        {
                            dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue(rec, null);
                        }
                    }

                }

                dtReturn.Rows.Add(dr);
            }
            return dtReturn;
        }

部分视图

@model [ApplicationName].ViewModels.ReportKPIViewModel

<style>
    td{
        white-space:nowrap;
    }
</style>

@if (Model.ReportKPIDetails != null)
{
    <div class="panel panel-success">
        <div class="panel-heading panel-title"><strong>KPI Report Results</strong></div>
        <div class="panel-body">
            <div style="overflow:auto">
                <table class="table table-condensed table-bordered table-hover">
                    <tr style="background-color: #00b8ce; color: white;">
                        @foreach (System.Data.DataColumn col in Model.dtReportDetails.Columns)
                        {
                            <th>@col.ColumnName</th>
                        }
                    </tr>

                    @foreach (System.Data.DataRow row in Model.dtReportDetails.Rows)
                {
                        <tr>
                            @foreach (var cell in row.ItemArray)
                            {
                                <td>
                                    @cell.ToString()
                                </td>
                            }
                        </tr>
                    }
                </table>
            </div>
        </div>
    </div>
}