[英]Dynamically selecting fields in a linq query
我有一個linq查詢,我想動態選擇我的用戶請求的字段。
目前我正在將我的Jobs映射到這樣的數據轉換對象:
var jobs = (from p in jobsDB
select new JobReportDTO()
{
JobID = p.JobID,
EventType = p.EventType,
DateApproved = p.ApprovedDate,
DateEntered = p.EnteredDate,
DateClosed = p.ClosedDate,
StartDate = p.StartDate,
FinishDate = p.FinishDate,
InsuredName = p.InsuredName,
StreetAddress = p.StreetAddress,
Suburb = p.Suburb,
State = p.State,
Postcode = p.Postcode,
.... etc
在這個函數中,我有許多布爾變量,用於標識是否應該將該字段發送到視圖,即:
public bool ShowInsuredName { get; set; }
public bool ShowSuburb { get; set; }
public bool ShowICLA { get; set; }
public bool ShowClaimNumber { get; set; }
public bool ShowFileMananger { get; set; }
public bool ShowSupervisor { get; set; }
public bool ShowStatus { get; set; }
... etc
如何修改我的linq查詢以僅顯示所選字段?
我試過了
var jobs = (from p in jobsDB
select new JobReportDTO()
{
JobID = p.JobID,
jobReport.ShowEventType == true ? EventType = p.EventType : "",
... etc
但我得到“無效的初始化成員聲明”
如果您能夠負擔得起LINQ方法語法並對諸如public bool Show{DTOPropertyName} { get; set; }
類的選項使用強命名約定public bool Show{DTOPropertyName} { get; set; }
public bool Show{DTOPropertyName} { get; set; }
public bool Show{DTOPropertyName} { get; set; }
,那么你可以讓你的生活變得與的幫助下更容易System.Linq.Expressions
及以下的小幫手方法
public static class MyExtensions
{
public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector, object options)
{
var memberInit = (MemberInitExpression)selector.Body;
var bindings = new List<MemberBinding>();
foreach (var binding in memberInit.Bindings)
{
var option = options.GetType().GetProperty("Show" + binding.Member.Name);
if (option == null || (bool)option.GetValue(options)) bindings.Add(binding);
}
var newSelector = Expression.Lambda<Func<TSource, TResult>>(
Expression.MemberInit(memberInit.NewExpression, bindings), selector.Parameters);
return source.Select(newSelector);
}
}
它的作用是刪除與值設置為false
關聯ShowProperty
的賦值。
用法很簡單
var jobs = jobsDB.Select(p => new JobReportDTO
{
JobID = p.JobID,
EventType = p.EventType,
DateApproved = p.ApprovedDate,
DateEntered = p.EnteredDate,
DateClosed = p.ClosedDate,
StartDate = p.StartDate,
FinishDate = p.FinishDate,
InsuredName = p.InsuredName,
StreetAddress = p.StreetAddress,
Suburb = p.Suburb,
State = p.State,
Postcode = p.Postcode,
.... etc
}, jobReport);
如果在調試器中設置斷點並檢查newSelector
變量,則會看到只包含沒有ShowProperty
(如JobID
)或具有ShowProperty = true
屬性。
試試這種方式:
EventType = jobReport.ShowEventType == true ? p.EventType : string.Empty,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.