Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ TO SQL, выборка записей по данным коллекции / 15 сообщений из 15, страница 1 из 1
28.05.2009, 17:58
    #36014125
Datar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
Пусть имеется некая коллекция:


Код: plaintext
1.
2.
3.
var empls = new System.Collections.ArrayList() {
      new { FName = "Иван", LName = "Иванов" },
      new { FName = "Петр", LName = "Петров" },
      new { FName = "Вася", LName = "Васильев" }};

И пусть имеется в базе данных таблица сотрудников. Как выбрать посредством LINQ To SQL сотрудников, имена и фамилии которых представлены в коллекции?

Если бы мы имели коллекцию только имен, то выбрка была простой, например так:


Код: plaintext
1.
var empls = new List<string>() { "Иван", "Петр", "Вася" };
dctx.Employees.Where(c => empls.Contains(c.FName));

Но как быть, если элементы коллекции имеют несколько свойств и отбор нужно вести по их совокупности?
...
Рейтинг: 0 / 0
28.05.2009, 18:51
    #36014259
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
Datar,

С анонимными типами, скорее всего не получится.
...
Рейтинг: 0 / 0
28.05.2009, 19:10
    #36014292
Datar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
Dmitry Sukhovilin,

Без проблем, могу создать тип:

Код: plaintext
class Person { string FName; string LName }
...
Рейтинг: 0 / 0
29.05.2009, 14:01
    #36015743
Datar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
Никто не сталкивался?
...
Рейтинг: 0 / 0
29.05.2009, 15:47
    #36016143
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
Datar,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var emps = new List<Person>();
            emps.Add(new Person() { FName = "Иван", LName = "Иванов" });
            emps.Add(new Person() { FName = "Петр", LName = "Петров" });
            emps.Add(new Person() { FName = "Вася", LName = "Васильев" });

            var needs = new List<string>() { "Иван", "Петр", "Вася" };

            var query = from emp in emps
                        where needs.Contains(emp.FName)
                        select emp;

            foreach (var item in query)
                Console.WriteLine(item.FName + " " + item.LName);

...
Рейтинг: 0 / 0
29.05.2009, 15:49
    #36016152
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
Dmitry Sukhovilin,

OUT:

Иван Иванов

Петр Петров

Вася Васильев
...
Рейтинг: 0 / 0
29.05.2009, 16:54
    #36016357
Datar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
Dmitry SukhovilinDatar,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var emps = new List<Person>();
            emps.Add(new Person() { FName = "Иван", LName = "Иванов" });
            emps.Add(new Person() { FName = "Петр", LName = "Петров" });
            emps.Add(new Person() { FName = "Вася", LName = "Васильев" });

            var needs = new List<string>() { "Иван", "Петр", "Вася" };

            var query = from emp in emps
                        where needs.Contains(emp.FName)
                        select emp;

            foreach (var item in query)
                Console.WriteLine(item.FName + " " + item.LName);



Мне нужно выбрать не по FName, а по обоим полям: FName и LName. Исходные данные должны быть такими:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
            var emps = new List<Person>();
            emps.Add(new Person() { FName = "Иван", LName = "Иванов", Birth = ... });
            emps.Add(new Person() { FName = "Петр", LName = "Петров", Birth = ... });
...
            emps.Add(new Person() { FName = "Вася", LName = "Васильев", Birth = ... });

            var needs = new List<Person_1>();
            emps.Add(new Person() { FName = "Иван", LName = "Иванов", Birth = ... });
            emps.Add(new Person() { FName = "Вася", LName = "Васильев", Birth = ... });

Нужно получить из emps все элементы для которых в needs есть совпадения по имени и фамилии, но не по дате рождения и прочим полям.
...
Рейтинг: 0 / 0
29.05.2009, 16:58
    #36016368
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
Datar,

ну и в чём проблема? where ( condition1 && condition2 )
...
Рейтинг: 0 / 0
29.05.2009, 16:59
    #36016372
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
& один
...
Рейтинг: 0 / 0
29.05.2009, 17:13
    #36016404
Datar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
buredDatar,

ну и в чём проблема? where ( condition1 && condition2 )

Работающий код есть?
...
Рейтинг: 0 / 0
29.05.2009, 17:52
    #36016495
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
DatarburedDatar,

ну и в чём проблема? where ( condition1 && condition2 )

Работающий код есть?

а самому написать ? ))

только для примера

Код: plaintext
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.
        void go()
        {
            var emps = new List<Person>();
            emps.Add(new Person() { FName = "Иван", LName = "Иванов" });
            emps.Add(new Person() { FName = "Петр", LName = "Петров" });
            emps.Add(new Person() { FName = "Вася", LName = "Васильев" });


            var needs = new List<Person>();
            needs.Add(new Person() { FName = "Иван", LName = "Иванов" });
            needs.Add(new Person() { FName = "!Петр", LName = "Петров" });
            needs.Add(new Person() { FName = "Вася", LName = "Васильев" });

            
            var query = from emp in emps
                        where needs.Contains(emp, emp)
                        select emp;

            foreach (var item in query)
                Console.WriteLine(item.FName + " " + item.LName);
        }

    }

    class Person : IEqualityComparer<Person>
    {
        public string FName; public string LName;

        #region IEqualityComparer<Person> Members

        public bool Equals(Person x, Person y)
        {
            return x.FName == y.FName && x.LName == y.LName;
        }

        public int GetHashCode(Person obj)
        {
            return obj.FName.GetHashCode();
        }

        #endregion
    }

...
Рейтинг: 0 / 0
29.05.2009, 19:19
    #36016635
Datar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
Dmitry Sukhovilin,

Спасибо, я понял смысл. Правда, этот метод генерит несколько запросов к базе данных.
...
Рейтинг: 0 / 0
29.05.2009, 19:27
    #36016646
Datar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
Dmitry Sukhovilin,

упс, поспешил. В рантайме вываливается ошибка, что что-то там не имеет преобразования в SQL.

Поигравшись с Contains более основательно я нашел следующее решение:

Код: plaintext
1.
2.
3.
4.
5.
6.
var employees = dctx.Employees.Where(c =>
            needs.Contains(new Person_1()
            {
              FName = c.FName,
              LName = c.LName
            }));

Неудобство в том, что нужно описывать класс Person_1. Если дальше нужно будет искать например по имени и дате рождения, то придется делать новый класс, чтобы подставть в Contains.
...
Рейтинг: 0 / 0
29.05.2009, 20:08
    #36016697
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
DatarburedDatar,

ну и в чём проблема? where ( condition1 && condition2 )

Работающий код есть?
нет блин, я всё придумал
...
Рейтинг: 0 / 0
01.06.2009, 11:27
    #36018515
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ TO SQL, выборка записей по данным коллекции
DatarDmitry Sukhovilin,

Неудобство в том, что нужно описывать класс Person_1. Если дальше нужно будет искать например по имени и дате рождения, то придется делать новый класс, чтобы подставть в Contains.

Думаю, что изначально вы пошли не по тому пути.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ TO SQL, выборка записей по данным коллекции / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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