我有一张包含大量数据的表格,我允许用户指定他们想要在表格中显示哪些数据(我正在使用多选列表)。
场景示例(以下是一个示例,与我的数据或字段无关,这只是为了简单起见)
我的表包含以下带有数据的列:
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);
}
}
答案 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)
首先,感谢所有通过评论并尝试帮助的人!由于我的问题格式,我期待一个更不友好/更有帮助的回复。
然而,我找到了解决问题的方法。为了快速描述我的所作所为:我知道这是相对习惯的,但也许它可以帮助别人。以下是我的所有代码:
<强>控制器:强> //这是点击提交按钮后点击的动作
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>
}