C# Linq查询——在WPF C中用一个查询执行预期结果
我在WPF和一个树视图一起工作 我有两个类,用于填充树视图的两个级别 第一个问题是,我可以用一个查询来实现这一点,或者比下面的查询更好 主要的问题是,我希望包括ViewDocItems中的h.ItemId和其他列,并且仍然在treeview中实现层次结构 现在,DochHistory类的标题是树的根级别 BaseHistory中的BaseNumber是第二级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
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);
}