Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq查询——在WPF C中用一个查询执行预期结果_C#_Wpf_Linq To Sql - Fatal编程技术网

C# Linq查询——在WPF C中用一个查询执行预期结果

C# Linq查询——在WPF C中用一个查询执行预期结果,c#,wpf,linq-to-sql,C#,Wpf,Linq To Sql,我在WPF和一个树视图一起工作 我有两个类,用于填充树视图的两个级别 第一个问题是,我可以用一个查询来实现这一点,或者比下面的查询更好 主要的问题是,我希望包括ViewDocItems中的h.ItemId和其他列,并且仍然在treeview中实现层次结构 现在,DochHistory类的标题是树的根级别 BaseHistory中的BaseNumber是第二级 public class DocHistory { private Observa

我在WPF和一个树视图一起工作

我有两个类,用于填充树视图的两个级别

第一个问题是,我可以用一个查询来实现这一点,或者比下面的查询更好

主要的问题是,我希望包括ViewDocItems中的h.ItemId和其他列,并且仍然在treeview中实现层次结构

现在,DochHistory类的标题是树的根级别

BaseHistory中的BaseNumber是第二级

        public class DocHistory
        {
            private ObservableCollection<BaseHistory> mBaseHis = new ObservableCollection<BaseHistory>();

            public Guid Id { get; set; }
            public Guid ClassId { get; set; }
            public string Title { get; set; }


            public ObservableCollection<BaseHistory> BaseHis { get { return mBaseline; } }
        }



        public class BaseHistory
        {
           public Guid BaseId { get; set; }
           public string BaseName { get; set; }
           public int BaseNumber { get; set; }
           public bool BaseFinal { get; set; }
        }



                   //this guid is only for testing
                    mGuid = new Guid("0497F3DA-AE3E-40C7-AF91-9B26EEE2A437");

                    var query = (from d in mContext.Docs
                                 orderby d.Title ascending
                                 join b in mContext.Base on d.DocId equals b.DocId
                                 join h in mContext.ViewDocItems on b.BaseId equals h.BaseId
                                 where h.ItemId == mGuid
                                 select d).Distinct();
                    List<Database.Doc> DocList = query.ToList();

                    foreach (Database.Doc result in DocList)
                    {
                        DocHistory newHistory = new DocuHistory() { Id = result.DocId, Title = result.Title, ClassId = result.ClassId };
                        mHistory.Add(newHistory);

                        var documents = from d in result.Base
                                        orderby d.LineNumber

                                    select new BaseHistory()
                                    {
                                        BaseId = d.BaseId,
                                        Name = d.Title,
                                        BaseFinal = d.Final.Value,
                                        LineNumber = d.LineNumber.Value

                                    };

                        documents.ToList().ForEach(d => newHistory.BaseHis.Add(d));

                    }
这是我要绑定的属性

    private ObservableCollection<DocHistory> mHistory = new ObservableCollection<DocHistory>();
    public ObservableCollection<DocHistory> DocsHistory
            {
                get
                {
                    return mHistory;
                }
            }
我正在为treeView使用ItemsSource={Binding Path=DocsHistory}

分层数据模板绑定到BaseHis

如果可以将BaseHis属性设置为IEnumerable,则可以执行以下操作:

var results =
    (from d in mContext.Docs
     orderby d.Title ascending
     join b in mContext.Base on d.DocId equals b.DocId
     join h in mContext.ViewDocItems on b.BaseId equals h.BaseId
     where h.ItemId == mGuid
     select new DocHistory 
     {
         Id = d.DocId, 
         Title = d.Title, 
         ClassId = d.ClassId,
         BaseHis =
             from b in d.Base
             orderby b.LineNumber
             select new BaseHistory
             {
                 BaseId = d.BaseId,
                 Name = d.Title,
                 BaseFinal = d.Final.Value,
                 LineNumber = d.LineNumber.Value
             }
    });

foreach(var r in results)
{
    mHistory.Add(r); 
} // or mHistory.AddRange(results)
即使您无法更改BaseHis的数据类型,也可以使用匿名类:

var results =
    (from d in mContext.Docs
     orderby d.Title ascending
     join b in mContext.Base on d.DocId equals b.DocId
     join h in mContext.ViewDocItems on b.BaseId equals h.BaseId
     where h.ItemId == mGuid
     select new
     {
         Id = d.DocId, 
         Title = d.Title, 
         ClassId = d.ClassId,
         BaseHis =
             from b in d.Base
             orderby b.LineNumber
             select new BaseHistory
             {
                 BaseId = d.BaseId,
                 Name = d.Title,
                 BaseFinal = d.Final.Value,
                 LineNumber = d.LineNumber.Value
             }
    });

foreach(var r in results)
{
    var hist = new DocHistory() 
    {
        Id = r.Id,
        Title = r.Title,
        ClassId = d.ClassId;
    };
    foreach(var h in r.BaseHis)
    {
        hist.BaseHis.Add(h);
    }

    mHistory.Add(r); 
}