数据绑定到网格时限制LINQ子查询

时间:2009-03-21 13:50:05

标签: c# linq linq-to-sql

我想限制我收回的子元素数量。在此示例中,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;

2 个答案:

答案 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();
}