powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ замена Where in в SQL
24 сообщений из 24, страница 1 из 1
LINQ замена Where in в SQL
    #35681793
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
LINQ замена Where in в SQL
    #35681977
OldWoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
LINQ замена Where in в SQL
    #35681994
OldWoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
LINQ замена Where in в SQL
    #35682051
Dmitry_Minsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
LINQ замена Where in в SQL
    #35682089
OldWoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
LINQ замена Where in в SQL
    #35682105
OldWoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
LINQ замена Where in в SQL
    #35682112
OldWoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
читайте Entity SQL Reference
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/wd_entityframework/html/61ce7ee1-ffe2-477d-8a9f-835b0a11d900.htm
...
Рейтинг: 0 / 0
LINQ замена Where in в SQL
    #35682113
Dmitry_Minsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я выбираю данные через LINQ. Не должно быть никакого SQL только объекты...
...
Рейтинг: 0 / 0
LINQ замена Where in в SQL
    #35682173
OldWoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
LINQ замена Where in в SQL
    #35682175
OldWoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как ни как это ПЕРВАЯ версия EF!!!
...
Рейтинг: 0 / 0
LINQ замена Where in в SQL
    #35682195
OldWoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитайте <a href="http://msdn.microsoft.com/ru-ru/magazine/cc507640.aspx">Вопросы и ответы по Entity Framework.</a>
...
Рейтинг: 0 / 0
LINQ замена Where in в SQL
    #35682344
Dmitry_Minsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/wd_entityframework/html/c3f393d4-5158-4f1e-830e-c328d3769ae2.htm

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

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

Код: plaintext
var z = entities.DocumentSet.Where(x => ids.Contains(x.id));
...
Рейтинг: 0 / 0
LINQ замена Where in в SQL
    #35683205
gp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читайте:
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
LINQ замена Where in в SQL
    #35683211
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();
...
Рейтинг: 0 / 0
LINQ замена Where in в SQL
    #35685002
OldWoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
LINQ замена Where in в SQL
    #35685499
Dmitry_Minsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
LINQ замена Where in в SQL
    #35685510
Dmitry_Minsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
LINQ замена Where in в SQL
    #35686657
gp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Естественно, Join "на два фронта" тоже не будет работать. В ссылках выше все описано.
...
Рейтинг: 0 / 0
LINQ замена Where in в SQL
    #35686671
gp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
LINQ замена Where in в SQL
    #35687249
OldWoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
LINQ замена Where in в SQL
    #35691790
Dmitry_Minsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
LINQ замена Where in в SQL
    #35727859
kto-to
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас в принципе все верно.
Вот гарантированно работающий пример
использующий 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
LINQ замена Where in в SQL
    #35727879
kto-to
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:)
ваше entities должно быть классса унаследованного от
System.Data.Linq.DataContext.
а у вас наверняка используется контекст entity Framework
:)

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


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