我想限制我收回的子元素数量。在此示例中,Order.CustomerID“VINET”具有3个订单明细。我只想查看单价为14的记录。我不希望看到单价等于9.8或43.8的订单明细
最后我想在动态查询或谓词中执行此操作,但简单的示例应该显示我的问题。我尝试了几种不同的方式,包括我在下面展示的两种方式。我意识到问题在于,当我扩展时,LINQ会自动运行自己的查询,但有没有人有一个很好的解决方案?
private void btnJoinProblem_Click(object sender, EventArgs e)
{
NorthwindDataContext db = new NorthwindDataContext();
var tempQ2 = (from od in db.Order_Details
join o in db.Orders on od.OrderID equals o.OrderID
where od.UnitPrice == 14
select o).Distinct();
}
还会在订单明细级别带回太多子记录
NorthwindDataContext db = new NorthwindDataContext();
var tempQ = from o in db.Orders
where o.Order_Details.Any(od => od.UnitPrice == 14)
select o;
var bindingSource = new BindingSource();
bindingSource.DataSource = tempQ;
ultraGrid1.DataSource = bindingSource;
答案 0 :(得分:1)
尝试绑定到BindingSource
并在查询中使用AsDataView()
,看看是否有效,如下所示:
var bindingSource = new BindingSource();
bindingSource.DataSource = tempQ.AsDataView();
当然,不要忘记将网格的数据源设置为BindingSource
。
快速说明:如果有联接,则无法使用AsDataView()
。 IIRC,以下应工作:
var tempQ = from o in db.Orders
where o.Order_Details.Any(od => od.UnitPrice == 14)
select o;
请注意,您可能希望使用子关系o.Order_Details,而不是db.Order_Details,(假设它在数据集中正确设置)。
答案 1 :(得分:1)
嗯,我要做的第一件事就是“选择”你想要的列为匿名类型(或命名类型) - 这意味着你得到了矩形数据,你不必担心这么多关于延迟加载。其次,您需要一个网格列表。
尝试类似:
using(NorthwindDataContext db = new NorthwindDataContext()) {
var query= from od in db.Order_Details
join o in db.Orders on od.OrderID equals o.OrderID
where od.UnitPrice == 14
select new {o.OrderId, o.Customer.CustomerName,
od.UnitPrice}; // etc
ultraGrid1.DataSource = query.Distinct().ToList();
}