powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / linq & datatable
23 сообщений из 23, страница 1 из 1
linq & datatable
    #37537687
Фотография unq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как проверить с помощью linq если запись в DataTable?

делаю так:

var res = from r in myTable.AsEnumerable()
where r.Field<int>("ID") == ID
select r

вообщем я получаю что-то в результат. А как проверить вернул запрос что-то или нет?

зы: сори если туплю((( пишу редко(
...
Рейтинг: 0 / 0
linq & datatable
    #37537713
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
res.Count()
...
Рейтинг: 0 / 0
linq & datatable
    #37537886
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУres.Count()res.Any()
...
Рейтинг: 0 / 0
linq & datatable
    #37538041
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУres.Count()res.Any()
myTable.Select("ID=3").Length
...
Рейтинг: 0 / 0
linq & datatable
    #37538089
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУmyTable.Select("ID=3").LengthНет! Будет цикл по всем тысячам найденных записей + создан массив! Нам это не надо!

Должно быть: IEnumerable<DataRow> + Any()
...
Рейтинг: 0 / 0
linq & datatable
    #37538192
Фотография unq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
res.Any()
myTable.Select("ID=3").Length

круть...

грац!
...
Рейтинг: 0 / 0
linq & datatable
    #37538202
Фотография unq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУmyTable.Select("ID=3").LengthНет! Будет цикл по всем тысячам найденных записей + создан массив! Нам это не надо!

Должно быть: IEnumerable<DataRow> + Any()

Учту.

Спс.
...
Рейтинг: 0 / 0
linq & datatable
    #37538259
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУmyTable.Select("ID=3").LengthНет! Будет цикл по всем тысячам найденных записей + создан массив! Нам это не надо!

Должно быть: IEnumerable<DataRow> + Any()

И у AsEnumerable будет цикл, который создает EnumerableRowCollection<DataRow>.

http://msdn.microsoft.com/ru-ru/library/system.data.datatableextensions.asenumerable.aspx Перечисляемый объект, который возвращается методом AsEnumerable, жестко привязан к создавшему его объекту DataTable. При нескольких вызовах метода AsEnumerable будет возвращено несколько независимых объектов для выполнения запроса, все из которых привязаны к исходному объекту DataTable.

Не путать с AsEnumerable<TSource>

AsEnumerable<TSource>Метод AsEnumerable<TSource>(IEnumerable<TSource>) не выполняет никаких действий, кроме изменения типа времени компиляции для последовательности source: тип, реализующий интерфейс IEnumerable<T>, изменяется на сам тип IEnumerable<T>

Так DataTable.AsEnumerable тормознее, чем DataTable.Select.
...
Рейтинг: 0 / 0
linq & datatable
    #37538291
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
Нет! Будет цикл по всем тысячам найденных записей + создан массив! Нам это не надо!

Должно быть: IEnumerable<DataRow> + Any()

И у AsEnumerable будет цикл, который создает EnumerableRowCollection<DataRow>.
Где там цикл?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class EnumerableRowCollection<TRow> : EnumerableRowCollection, IEnumerable<TRow>, IEnumerable
{
    internal EnumerableRowCollection(DataTable table)
    {
        ...
        this._enumerableRows = table.Rows.Cast<TRow>();
        ...
    }

    public IEnumerator<TRow> GetEnumerator()
    {
        return this._enumerableRows.GetEnumerator(); // глубже будем смотреть?
    }
}
...
Рейтинг: 0 / 0
linq & datatable
    #37538304
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var table = new DataTable();
table.Columns.Add("ID", typeof(int));
for (int j = 1; j <= 1000000; j++)
{
    table.Rows.Add(j);
}

var test1 = Test(table, 1);
var test2 = Test(table, 10);
var test3 = Test(table, 100);
var test4 = Test(table, 1000);
var test5 = Test(table, 10000);
var test6 = Test(table, 100000);
var test7 = Test(table, 1000000);
Execute && Test
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
static long Execute(Action action)
{
    Stopwatch sw = Stopwatch.StartNew();
    action();
    return sw.ElapsedMilliseconds;
}

static Tuple<long, long> Test(DataTable table, int value)
{
    long res1 = Execute(() =>
    {
        bool exist = table.Select("ID=" + value).Length > 0;
    });

    long res2 = Execute(() =>
    {
        bool exist = table.AsEnumerable().Where(d => d.Field<int>("ID") == 3000000).Any();
    });

    return new Tuple<long, long>(res1, res2);
}


Тесты в миллисекундах.

№DataTableLinq1,1406,1732,0,1573,0,1584,0,1555,0,1576,0,1517,0,153

Первый поиск просаживается, потом кеширование и нереальная производительность. Вопросы?
...
Рейтинг: 0 / 0
linq & datatable
    #37538308
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
№DataTableLinq11406173201573015840155501576015170153
...
Рейтинг: 0 / 0
linq & datatable
    #37538314
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУА теперь сделайте, чтобы в критерий попадало много записей вместо одной. Чтобы тонким местом стало создание массива.
...
Рейтинг: 0 / 0
linq & datatable
    #37538319
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУА теперь сделайте, чтобы в критерий попадало много записей вместо одной. Чтобы тонким местом стало создание массива.
1. Немного налажал со значение в 3000000, но суть не меняется :)
2. Почему тонким? Там же обычный фильтр в селекте.
...
Рейтинг: 0 / 0
linq & datatable
    #37538323
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУПервый поиск просаживается, потом кеширование и нереальная производительность.Походу там внутри мутится какой-то индекс...
...
Рейтинг: 0 / 0
linq & datatable
    #37538326
Фотография unq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУпотом кеширование и нереальная производительность. Вопросы?

А в каком случае "кэш" очистится?
Точнее как,... datatable статична почти на всем этапе выполнения. Она заполняется при старте программы и далее к ней идут только запросы.
Так вот будет ли эта производительность выстреливать на протяжении всего исполнения или после того как ход выполнения убежит за пределы класса в котором находится мой метод или за пределы метода?
...
Рейтинг: 0 / 0
linq & datatable
    #37538328
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ2. Почему тонким? Там же обычный фильтр в селекте.Сделать, чтобы в критерии фильтрации попадало много записей. Тогда будет создаваться большой массив с возвращаемыми значениями. Тогда, наверное, будет медленно.
...
Рейтинг: 0 / 0
linq & datatable
    #37538340
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУ2. Почему тонким? Там же обычный фильтр в селекте.Сделать, чтобы в критерии фильтрации попадало много записей. Тогда будет создаваться большой массив с возвращаемыми значениями. Тогда, наверное, будет медленно.
Да, тут согласен.

Код: plaintext
bool exist = table.Select(string.Format("ID={0} OR ID={1} OR ID={2} OR ID={3}", value, value2, value3, value4)).Length > 0;

Вообще тупняк, по сравнению с

Код: plaintext
bool exist = table.AsEnumerable().Where(d => new int[] { value, value2, value3, value4 }.Contains(d.Field<int>("ID"))).Any();
...
Рейтинг: 0 / 0
linq & datatable
    #37538345
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unqТак вот будет ли эта производительность выстреливать на протяжении всего исполнения или после того как ход выполнения убежит за пределы класса в котором находится мой метод или за пределы метода?
Нужно тестировать под нагрузкой в реальных условиях, сходу мне сложно сказать.
...
Рейтинг: 0 / 0
linq & datatable
    #37538350
Фотография unq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУunqТак вот будет ли эта производительность выстреливать на протяжении всего исполнения или после того как ход выполнения убежит за пределы класса в котором находится мой метод или за пределы метода?
Нужно тестировать под нагрузкой в реальных условиях, сходу мне сложно сказать.

мб. сборщик мусора имеет отношение?
Тогда вообще грустно.
...
Рейтинг: 0 / 0
linq & datatable
    #37538354
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unqмб. сборщик мусора имеет отношение?
Не думаю. Вся суть в реализации DataTable + фильтр.
...
Рейтинг: 0 / 0
linq & datatable
    #37538360
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче. Для тыщёнки другой записей в DataTable:

Код: plaintext
myTable.Select("ID=3").Length 

и не нужен никакой Linq. К тому же ещё лишний неймспейс тянуть придется )

Кому не нравится - в сад!

!
...
Рейтинг: 0 / 0
linq & datatable
    #37538389
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУКороче. Для тыщёнки другой записей в DataTable:

Код: plaintext
myTable.Select("ID=3").Length 

и не нужен никакой Linq. К тому же ещё лишний неймспейс тянуть придется )

Кому не нравится - в сад!LINQ не нужен. Нужен Dictionary. Как по-вашему DataTable.Select добивается таких результатов? Правильно - мутит индекс .
...
Рейтинг: 0 / 0
linq & datatable
    #37538399
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вдогонку:

Код: plaintext
1.
2.
3.
4.
5.
6.
var idIndex = dataTable
    .AsEnumerable()
    .ToDictionary(v => v.Field<int>("ID"));

while(/*много много раз*/)
    idIndex.ContainsKey(100500);
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / linq & datatable
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]