Две таблицы...
Как проще всего написать эквивалент <SELECT * FROM AA A WHERE A.NO IN (SELECT NO FROM BB B)>
в С#?
Пока Я их предварительно отсортировал с делал все в один проход - все быстро, но читать тяжело.
Хочется чтобы было так же быстро, но выглядело по-проще...
var query = from current in pCurrent.Rows.Cast<Rows.UnfinishedOrders>()
join delivery in deliveryStatus.Cast<Rows.DeliveryStatus>() on current.OrderNo equals delivery.OrderNo
select current;
int count = query.Count();
Unable to cast - - of type 'System.Data.DataRow' to type 'UnfinishedOrders'.
При этом <public static implicit operator UnfinishedOrders(DataRow)> - имеется.
<LINQ> - хорошо, но надо регулярно пользоваться... забыл уже детали...
Эээ... этот кусок сейчас получается одним из тормозов - выборка из базы делается быстрее, чем двойной цикл с проверкой совпадений...
Придется делать некрасивый и малопонятный код прохождения двух сортированных таблиц... ![]()
var query = from current in pCurrent.Rows.Cast<DataRow>()
join delivery in deliveryStatus.Cast<Rows.DeliveryStatus>() on current["orderNo"] equals delivery.OrderNo
select current;
и получил ноль отобранных на выходе...
Правда, надо признать, ноль был получен почти мгновенно... ![]()
Обходится либо так, как ты сделал, либо
pCurrent.Rows.Cast<DataRow>().Select(r => (Rows.UnfinishedOrders)r)
наверное экономичнее будет приведение в селектор ключа запихнуть:
var query = from current in pCurrent.Rows.Cast<DataRow>()
join delivery in deliveryStatus.Cast<Rows.DeliveryStatus>() on ((Rows.UnfinishedOrders)current).OrderNo equals delivery.OrderNo
select current;
И дизайнено так, что бы до внутреннего <DataRow> добраться было сложно...
Хотя... может ну его, этот <DataTable>?
Что меня смущает - есть такая радость <CopyToDataTable()>
С <DataRow[ ]> - работает на раз... а вот с результатом <Select>а - полный облом.
var query = from current in pCurrent.Rows.Cast<DataRow>()
join delivery in deliveryStatus.Cast<Rows.DeliveryStatus>() on current["orderNo"] equals delivery.OrderNo
select current;
будет IEnumerable<DataRow>.
-----
Да, но с пустым результатом.
Проблема - current["orderNo"] equals delivery.OrderNo - <decimal> <int>.
Актуальный код:
var query1 = from current in pCurrent.Rows.Cast<DataRow>().Select(r => (Rows.UnfinishedOrders)r)
join delivery in deliveryStatus.Cast<Rows.DeliveryStatus>() on current.OrderNo equals delivery.OrderNo
where delivery.DeliveryStatusS == TDeliveryStatus.NotDelivered
select current;
var query2 = from current in pCurrent.Rows.Cast<DataRow>().Select(r => (Rows.UnfinishedOrders)r)
join delivery in deliveryStatus.Cast<Rows.DeliveryStatus>() on current.OrderNo equals delivery.OrderNo
where delivery.DeliveryStatusS == TDeliveryStatus.PartiallyDelivered
select current;
foreach (Rows.UnfinishedOrders row in query1)
{
row.DeliveryStatus = TDeliveryStatus.NotDelivered;
}
foreach (Rows.UnfinishedOrders row in query2)
{
row.DeliveryStatus = TDeliveryStatus.PartiallyDelivered;
}
дальше нужно слияние и перегонка в <DataTable>. Ну либо переработка (ее мне сейчас делать не хочется) остального кода.
Хммм... там, по имеющемуся коду, еще одно поле требует заполнения, но за все время Я не видел, чтобы значения отличались.
Пока другая задница вылезла. Хитрая такая...
Если делать заполнение таблицы из какого-то стандартного источника - <DataReader> и Ко - то в <DataTable> помещаются данные и структура этих данных.
А вот если заполнять таблицу через <ImportRow()>, то структуры на месте не имеется...
Пошел искать где допустимо пользовать <Clone()>...



