动态选择linq查询中的字段

时间:2016-01-12 20:03:38

标签: c# linq

我有一个linq查询,我想动态选择我的用户请求的字段。

目前我正在将我的Jobs映射到这样的数据转换对象:

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

在这个函数中,我有许多布尔变量来识别是否应该将该字段发送到视图,即:

var jobs = (from p in jobsDB
    select new JobReportDTO()
    {
        JobID = p.JobID,
        jobReport.ShowEventType == true ? EventType = p.EventType : "",
        ... etc

如何修改我的linq查询以仅显示所选字段?

我试过

    private func playVideo(name: String) {

    guard name != "" else {
        return
    }

    let bundle = NSBundle(forClass:object_getClass(self))
    let path = bundle.pathForResource(name, ofType:"mp4")
    let url = NSURL.fileURLWithPath(path!)
    self.avPlayer = AVPlayer(URL: url)

    if (self.avPlayerLayer == nil) {
        self.avPlayerLayer = AVPlayerLayer(player: self.avPlayer)
        self.avPlayerLayer.frame = previewViews[1].frame
        previewViews[1].layer.addSublayer(self.avPlayerLayer)

        avPlayer.actionAtItemEnd = .None

        //Listen for AVPlayerItemDidPlayToEndTimeNotification
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: self.avPlayer.currentItem)
    }

    avPlayer.play()

}

但是我得到了“无效的初始化成员声明者”

2 个答案:

答案 0 :(得分:2)

如果您能够负担LINQ方法语法并对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);
    }
}

它的作用是删除已将关联ShowProperty且值设置为false的分配。

用法很简单

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)或{ {1}}包括在内。

答案 1 :(得分:1)

尝试这种方式:

EventType = jobReport.ShowEventType == true ? p.EventType : string.Empty,