powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ Запрос к двум таблицам
11 сообщений из 11, страница 1 из 1
LINQ Запрос к двум таблицам
    #38659855
OlgaM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, столкнулась с такой проблемой, есть две таблицы DataTable А и Б. Нужно добавить записи в А которых нет в Б подскажите пожалуйста как это сделать с помощью LINQ.
...
Рейтинг: 0 / 0
LINQ Запрос к двум таблицам
    #38660705
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OlgaM123,

Contains()
...
Рейтинг: 0 / 0
LINQ Запрос к двум таблицам
    #38660766
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch, тогда уж Except... да т.с. просто немного затупил... уж поди сам все давно сделал... :)
...
Рейтинг: 0 / 0
LINQ Запрос к двум таблицам
    #38661004
OlgaM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо буду пробовать.
...
Рейтинг: 0 / 0
LINQ Запрос к двум таблицам
    #38661054
OlgaM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я попробовала вот так но безуспешно
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
 
 DataTable Dt16 = ReadTable(con16, t);
 DataTable DtOsn = ReadTable(conOsn, t);

 var query = from inv in Dt16.AsEnumerable() 
         join item in DtOsn.AsEnumerable() 
             on inv["ko"] equals item["ko"] 
         where (item["ko"] == null)
         select inv;



Возможно выражение where построено неправильно
...
Рейтинг: 0 / 0
LINQ Запрос к двум таблицам
    #38661141
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
left join делается немного иначе... ( http://msdn.microsoft.com/en-us/library/bb397895.aspx)
попробуйте через Contains(), как Lelouch советовал. В вашем случае, запись будет более лаконичной

http://msdn.microsoft.com/ru-ru/library/bb552415(v=vs.110).aspx
...
Рейтинг: 0 / 0
LINQ Запрос к двум таблицам
    #38661289
OlgaM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser, спасибо за ссылки. Хотя http://msdn.microsoft.com/en-us/library/bb397895.aspx пустая)
Насчет метода Contains() я не понимаю как применить его к таблице. Пробую так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 DataTable Dt16 = ReadTable(con16, t);
 DataTable DtOsn = ReadTable(conOsn, t);

               List<string> B = (from r in Dt16.AsEnumerable() 
                     select r.Field<string>("ko")).ToList();

               foreach (var k in B)
               {
                   bool hasKo = DtOsn.AsQueryable().Contains(k); // AsQueryable() не поддерживается
               }
...
Рейтинг: 0 / 0
LINQ Запрос к двум таблицам
    #38661394
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взято отсель - тынц
Код в спойлере...
Удобная тула... для тестов - тынц

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
class Student
    {
        public int Id;
        public string Name;
    }
	
static DataTable GetDataTable(Student[] students)
        {
            DataTable table = new DataTable(); 
            table.Columns.Add("Id", typeof(Int32)); 
            table.Columns.Add("Name",typeof(string));
            foreach (Student student in students)
            {
                table.Rows.Add(student.Id, student.Name);
            }
            return (table);
        }	
		
void Main()
{
			Student[] students_a = {
									new Student { Id=1, Name="Александр Ерохин"},
									new Student { Id=5, Name="Елена Волкова"},
									new Student { Id=9, Name="Дмитрий Моисеенко"},
									new Student { Id=1, Name="Александр Ерохин"},
									new Student { Id=16, Name="Андрей Мухамедшин"},
									new Student { Id=20, Name="Ирина Сас"},
									new Student { Id=28, Name="Артем Амурин"}
                                 };
								 
			Student[] students_b = {
									new Student { Id=1, Name="Александр Ерохин"},
									new Student { Id=5, Name="Елена Волкова"},
									new Student { Id=100, Name="New Memeber"}
                                 };								 
								 

            DataTable dt_a = GetDataTable(students_a);	
            DataTable dt_b = GetDataTable(students_b);				
			
			dt_a.Dump("Before");
			
			var q_contains = dt_b.AsEnumerable().Where(b_row => !dt_a.AsEnumerable().Select(row_a => row_a.Field<Int32>("Id")).Contains(b_row.Field<Int32>("Id")) );
			
			q_contains.ToList<DataRow>().ForEach(new_one => dt_a.Rows.Add(new_one.Field<Int32>("Id"), new_one.Field<string>("Name")));
			
			dt_a.Dump("After");
			
			
}

// Define other methods and classes here

...
Рейтинг: 0 / 0
LINQ Запрос к двум таблицам
    #38661401
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OlgaM123,

когда вы упомянули о таблицах, я решил, что вас интересует LINQ 2 SQL или EF. В вашем же случае надо использовать методы IEnumerable.Contains или IEnumerable.Except
...
Рейтинг: 0 / 0
LINQ Запрос к двум таблицам
    #38661576
OlgaM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser, спасибо. Сработало! Ваша строчка буквально спасла все дело =)
Lelouch, тоже весьма благодарна за помощь но с методам AsEnumerable.Contains ничего не получилось =(

Проблема решена всем спасибо кто помогал
Вот так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
DataTable Dt16 = ReadTable(con16, t);
DataTable DtOsn = ReadTable(conOsn, t);

    var q_contains = Dt16.AsEnumerable().Where(b_row => !DtOsn.AsEnumerable().Select(row_a => row_a.Field<Int64>("ko")).Contains(b_row.Field<Int64>("ko")));
    List<DataRow> test = q_contains.ToList<DataRow>();
                foreach (var s in test)
                {
                    DtOsn.Rows.Add(s.ItemArray);
                }
...
Рейтинг: 0 / 0
LINQ Запрос к двум таблицам
    #38661949
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А причем там было AsEnumerable().Contains ?:)
P.S. В вашем решении именно этот метод используется: Select(row_a => row_a.Field<Int64>("ko")). Contains (b_row.Field<Int64>("ko")));
Видимо вы пытались просто передать набор строк второй таблицы, без Select )
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ Запрос к двум таблицам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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