簡體   English   中英

動態選擇linq查詢中的字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM