Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ замена Where in в SQL / 24 сообщений из 24, страница 1 из 1
28.11.2008, 13:22
    #35681793
Dmitry_Minsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
мне нужна такая вот выборка

Код: plaintext
1.
2.
select * from document doc
where doc.id in (1, 2, 3)
Как это переписать на LINQ?

Пробовал так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int [] ids = {1, 2, 3}

var documentsQuery =
             from document in entities.DocumentSet             
             where ids.Contains(document.id)
             select document;

var list = documentsQuery.ToList();

Выдает ошибку:

LINQ to Entities does not recognize the method 'Boolean Contains...
...
Рейтинг: 0 / 0
28.11.2008, 14:11
    #35681977
OldWoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Dmitry_Minskмне нужна такая вот выборка

Код: plaintext
1.
2.
select * from document doc
where doc.id in (1, 2, 3)
Как это переписать на LINQ?

Пробовал так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int [] ids = {1, 2, 3}

var documentsQuery =
             from document in entities.DocumentSet             
             where ids.Contains(document.id)
             select document;

var list = documentsQuery.ToList();

Выдает ошибку:

LINQ to Entities does not recognize the method 'Boolean Contains...

Код: plaintext
.Where(c=>ids.Contains(c.id)

Pro LINQ: Language Integrated Query in C# 2008
Copyright © 2007 by Joseph C. Rattz, Jr. p 442
...
Рейтинг: 0 / 0
28.11.2008, 14:16
    #35681994
OldWoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Dmitry_Minskмне нужна такая вот выборка

Код: plaintext
1.
2.
select * from document doc
where doc.id in (1, 2, 3)
Как это переписать на LINQ?

Пробовал так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int [] ids = {1, 2, 3}

var documentsQuery =
             from document in entities.DocumentSet             
             where ids.Contains(document.id)
             select document;

var list = documentsQuery.ToList();

Выдает ошибку:

LINQ to Entities does not recognize the method 'Boolean Contains...
У меня работает и так

Код: plaintext
1.
2.
3.
4.
5.
db = new DepartmentDataContext();
           
int[] ids = {1, 3};
BindingSource.DataSource =
                (from d in db.Departments
                 where (ids.Contains(d.ID)) select d);
...
Рейтинг: 0 / 0
28.11.2008, 14:31
    #35682051
Dmitry_Minsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
OldWoker
Код: plaintext
.Where(c=>ids.Contains(c.id)

Pro LINQ: Language Integrated Query in C# 2008
Copyright © 2007 by Joseph C. Rattz, Jr. p 442

Куда вставить Where(c=>ids.Contains(c.id) ??
Если можно напишите полный вариант моего примера.
...
Рейтинг: 0 / 0
28.11.2008, 14:40
    #35682089
OldWoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Dmitry_Minsk
Куда вставить Where(c=>ids.Contains(c.id) ??
Если можно напишите полный вариант моего примера.
Виноват!
В EF это пишется так

var query =new ObjectQuery<Data.Department>("SELECT VALUE E FROM Department AS E", db);
query = query.Where("it.id in {1,2}");
query = query.OrderBy("it.ID");
...
Рейтинг: 0 / 0
28.11.2008, 14:44
    #35682105
OldWoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Dmitry_Minskмне нужна такая вот выборка

Код: plaintext
1.
2.
select * from document doc
where doc.id in (1, 2, 3)
Как это переписать на LINQ?

Пробовал так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int [] ids = {1, 2, 3}

var documentsQuery =
             from document in entities.DocumentSet             
             where ids.Contains(document.id)
             select document;

var list = documentsQuery.ToList();

Выдает ошибку:

LINQ to Entities does not recognize the method 'Boolean Contains...
Для вашего примера это будет так
Код: plaintext
1.
2.
var query =new ObjectQuery<DocumentSet>("SELECT VALUE E FROM DocumentSet AS E", entities);
var query = query.Where("it.id in {1,2,3}");
...
Рейтинг: 0 / 0
28.11.2008, 14:45
    #35682112
OldWoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
читайте Entity SQL Reference
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/wd_entityframework/html/61ce7ee1-ffe2-477d-8a9f-835b0a11d900.htm
...
Рейтинг: 0 / 0
28.11.2008, 14:45
    #35682113
Dmitry_Minsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Я выбираю данные через LINQ. Не должно быть никакого SQL только объекты...
...
Рейтинг: 0 / 0
28.11.2008, 15:00
    #35682173
OldWoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Dmitry_MinskЯ выбираю данные через LINQ. Не должно быть никакого SQL только объекты...
Это не sql а EF SQl, что касается EF LINQ то читайте Supported and Unsupported Methods (LINQ to Entities)
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/wd_entityframework/html/7f3ffa5f-f819-4730-bcdb-09b23de3b6d0.htm
...
Рейтинг: 0 / 0
28.11.2008, 15:01
    #35682175
OldWoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
как ни как это ПЕРВАЯ версия EF!!!
...
Рейтинг: 0 / 0
28.11.2008, 15:08
    #35682195
OldWoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Почитайте <a href="http://msdn.microsoft.com/ru-ru/magazine/cc507640.aspx">Вопросы и ответы по Entity Framework.</a>
...
Рейтинг: 0 / 0
28.11.2008, 15:54
    #35682344
Dmitry_Minsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/wd_entityframework/html/c3f393d4-5158-4f1e-830e-c328d3769ae2.htm

Contains - Not supported вот так вот..
...
Рейтинг: 0 / 0
28.11.2008, 20:15
    #35683002
avgalex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Dmitry_Minsk,

можно попробовать так. Хотя это тоже что и у Вас.

Код: plaintext
var z = entities.DocumentSet.Where(x => ids.Contains(x.id));
...
Рейтинг: 0 / 0
29.11.2008, 03:14
    #35683205
gp
gp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Читайте:
Set Methods (LINQ to Entities)

Код: plaintext
1.
2.
3.
bool Contains<TSource>(
this IQueryable<TSource> source,
TSource item
)
Не поддерживается в Entities.

Ваш код будет прекрасно работать в Linq To Sql, но не в Linq To Entities.

Linq To Sql сгенерит что-то вроде:
Код: plaintext
1.
2.
3.
SELECT [t0].[ID]
FROM [dbo].[Documents] AS [t0]
WHERE [t0].[ID] IN (@p0, @p1, @p2)

Entities так не умеет. Я бы попробовал что-то типа:
int [] ids = {1, 2, 3};
var q = from d in ctx.Documents select d where d.id == ids[0];
for(for i = 1; i < ids.Count; i++)
{
q = q.Union(from d in ctx.Documents select d where d.id == ids[i]);
}
var result = q.ToList();
...
Рейтинг: 0 / 0
29.11.2008, 03:46
    #35683211
gp
gp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Извиняюсь за ошибки, вот этот код сработает точно. Linq To Entities настолько неповоротлив, что даже на индексацию массива не может вычислить, приходится присваивать значение переменной.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int[] ids = { 1, 2 };
				int firstID = ids[0];
				var q = from d in ctx.Documents where d.ID == firstID select d;
				for (var i = 1; i < ids.Length; i++)
				{
					int id = ids[i];
					q = q.Union(from d in ctx.Documents where d.ID == id select d);
				}
				var result = q.ToList();
...
Рейтинг: 0 / 0
01.12.2008, 12:31
    #35685002
OldWoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
gpИзвиняюсь за ошибки, вот этот код сработает точно. Linq To Entities настолько неповоротлив, что даже на индексацию массива не может вычислить, приходится присваивать значение переменной.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int[] ids = { 1, 2 };
				int firstID = ids[0];
				var q = from d in ctx.Documents where d.ID == firstID select d;
				for (var i = 1; i < ids.Length; i++)
				{
					int id = ids[i];
					q = q.Union(from d in ctx.Documents where d.ID == id select d);
				}
				var result = q.ToList();

Выглядит страшновато, а чем не нравится решение на EF SQL?
Код: plaintext
var query = query.Where("it.id in {1,2,3}");
...
Рейтинг: 0 / 0
01.12.2008, 14:37
    #35685499
Dmitry_Minsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
OldWoker
Выглядит страшновато, а чем не нравится решение на EF SQL?
Код: plaintext
var query = query.Where("it.id in {1,2,3}");



Нужно чтобы не было привязки к полям таблицы - в данном случае поле id, хотелось бы все реализовать объектным способом.

Пробовал через JOIN, тоже ошибка вылетает...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
long[] ids = { 1, 2, 3 };

var documentsQuery =
             from document in entities.DocumentSet             
             select document;


documentsQuery  = documentsQuery.Join(ids, doc => doc.Id, id => id, (doc, id) => id );

result = documentsQuery.ToList();


Если же JOIN идет на 2 массива, то все ok..
...
Рейтинг: 0 / 0
01.12.2008, 14:39
    #35685510
Dmitry_Minsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ong[] ids = { 1, 2, 3 };

var documentsQuery =
             from document in entities.DocumentSet             
             select document;


documentsQuery  = documentsQuery.Join(ids, doc => doc.Id, id => id, (doc, id) => doc );

result = documentsQuery.ToList();
...
Рейтинг: 0 / 0
01.12.2008, 23:40
    #35686657
gp
gp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Естественно, Join "на два фронта" тоже не будет работать. В ссылках выше все описано.
...
Рейтинг: 0 / 0
01.12.2008, 23:52
    #35686671
gp
gp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
OldWokergpИзвиняюсь за ошибки, вот этот код сработает точно. Linq To Entities настолько неповоротлив, что даже на индексацию массива не может вычислить, приходится присваивать значение переменной.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int[] ids = { 1, 2 };
				int firstID = ids[0];
				var q = from d in ctx.Documents where d.ID == firstID select d;
				for (var i = 1; i < ids.Length; i++)
				{
					int id = ids[i];
					q = q.Union(from d in ctx.Documents where d.ID == id select d);
				}
				var result = q.ToList();

Выглядит страшновато, а чем не нравится решение на EF SQL?
Код: plaintext
var query = query.Where("it.id in {1,2,3}");


Не нравится потому что это не Linq. А в теме сказано Linq.
Ну попробуйте расширить этот метод на случай массива с 20 вхождениями, и все будет понятно.
Обратно к генерации кода возвращаемся.
Не уверен, что в этом случае код будет сколько-нибудь изящнее чем приведенный здесь.

Кстати, зачем вдруг понадобилась такая конструкция, где вы храните список ID документов, кроме базы?
Большинство подобных тактических проблем имеют архитектурное решение. Предположим, если вы сформировали некий список идентификаторов на сервере, вы бы вызывали эту процедуру по идентификатору списка, вместо того, чтобы передавать массив в процедуру.

PS.
Совершенно непонятно, вообще-то, почему EF не может сделать нормального linq.
...
Рейтинг: 0 / 0
02.12.2008, 11:27
    #35687249
OldWoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
Dmitry_MinskOldWoker
Выглядит страшновато, а чем не нравится решение на EF SQL?
Код: plaintext
var query = query.Where("it.id in {1,2,3}");



Нужно чтобы не было привязки к полям таблицы - в данном случае поле id, хотелось бы все реализовать объектным способом.


Вы не поняли - id это из EDM могу в EDM назвать поле Myid тогда запрос будет
Код: plaintext
1.
2.
 var query =new ObjectQuery<Person.Department>("SELECT VALUE E FROM Department AS E", db);
            query = query.Where("it.Myid in {1,2}");
            query = query.OrderBy("it.MyID");
...
Рейтинг: 0 / 0
03.12.2008, 19:43
    #35691790
Dmitry_Minsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
OldWoker... а чем не нравится решение на EF SQL?
Код: plaintext
var query = query.Where("it.id in {1,2,3}");


Так тоже не получается. На самом деле нужно написать запрос сложнее. Типа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
var documents = ((ObjectQuery<Document>)from document in entities.DocumentSet
                                                   from docSenderInfos in document.DocSenderInfos
                                                   from docRecipientInfos in docSenderInfos.DocRecipientInfos
                                                   //where docRecipientInfos.id in {1,2,3}
                                                   select document);

то есть нужно выбрать такие документы, у которых docRecipientInfos.id входит в заданное множество.
    

Пока не получется сделать через Where("it.id in {1,2,3}")...
...
Рейтинг: 0 / 0
22.12.2008, 14:12
    #35727859
kto-to
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
У вас в принципе все верно.
Вот гарантированно работающий пример
использующий LINQ to SQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
        public static IEnumerable<Log>  GeyByIDs(OctopusClassesDataContext context, int[] ids)
        {
            return
                (from t in context.Logs
                 where ids.Contains(t.ID)
                 select t);

        }
Log - это entity (строка) таблицы dbo.log
OctopusClassesDataContext - это название класса вашего контекста

Dmitry_Minskмне нужна такая вот выборка

Код: plaintext
1.
2.
select * from document doc
where doc.id in (1, 2, 3)
Как это переписать на LINQ?

Пробовал так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int [] ids = {1, 2, 3}

var documentsQuery =
             from document in entities.DocumentSet             
             where ids.Contains(document.id)
             select document;

var list = documentsQuery.ToList();

Выдает ошибку:

LINQ to Entities does not recognize the method 'Boolean Contains...
...
Рейтинг: 0 / 0
22.12.2008, 14:18
    #35727879
kto-to
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ замена Where in в SQL
:)
ваше entities должно быть классса унаследованного от
System.Data.Linq.DataContext.
а у вас наверняка используется контекст entity Framework
:)

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


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