Ограничить подзапрос LINQ при привязке данных к сетке - PullRequest
2 голосов
/ 21 марта 2009

Я хочу ограничить количество дочерних элементов, которые я получаю обратно. В этом примере 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 ]

1 голос
/ 21 марта 2009

Ну, во-первых, я бы «выбрал» нужные столбцы в анонимный тип (или именованный тип) - это означает, что вы получаете прямоугольные данные, и вам не нужно так сильно беспокоиться о ленивой загрузке. Во-вторых, вам нужен список для сетки.

Попробуйте что-то вроде:

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();
}
1 голос
/ 21 марта 2009

Попробуйте связать с 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 (при условии, что оно правильно настроено в наборе данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...