Вход на сайт
Две таблицы...
NEW 08.06.15 15:16
Дано - две таблицы <DataTable> АА & BB - заполняемые из физически разных оракловских баз...
Как проще всего написать эквивалент <SELECT * FROM AA A WHERE A.NO IN (SELECT NO FROM BB B)>
в С#?
Пока Я их предварительно отсортировал с делал все в один проход - все быстро, но читать тяжело.
Хочется чтобы было так же быстро, но выглядело по-проще...
Как проще всего написать эквивалент <SELECT * FROM AA A WHERE A.NO IN (SELECT NO FROM BB B)>
в С#?
Пока Я их предварительно отсортировал с делал все в один проход - все быстро, но читать тяжело.
Хочется чтобы было так же быстро, но выглядело по-проще...
NEW 12.06.15 13:03
в ответ NightWatch 08.06.15 16:08
Попробовал;
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> - хорошо, но надо регулярно пользоваться... забыл уже детали...
Эээ... этот кусок сейчас получается одним из тормозов - выборка из базы делается быстрее, чем двойной цикл с проверкой совпадений...
Придется делать некрасивый и малопонятный код прохождения двух сортированных таблиц... ![]()
NEW 12.06.15 13:09
в ответ Murr 12.06.15 13:03
Поправил на:
var query = from current in pCurrent.Rows.Cast<DataRow>()
join delivery in deliveryStatus.Cast<Rows.DeliveryStatus>() on current["orderNo"] equals delivery.OrderNo
select current;
и получил ноль отобранных на выходе...
Правда, надо признать, ноль был получен почти мгновенно... ![]()
NEW 12.06.15 16:23
Э-э-э, тут дело в раннем связывании. Методы преобразования типов должны быть известны и связываются во время компиляции. Так что Enumerable.Cast "не знает" о существовании пользовательского метода преобразования.
Обходится либо так, как ты сделал, либо
Обходится либо так, как ты сделал, либо
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;



