Как вы можете обработать подзапрос IN с помощью LINQ to SQL?

Я немного зациклился на этом. В основном я хочу сделать что-то вроде следующего SQL-запроса в LINQ to SQL:

SELECT f.* 
FROM Foo f
WHERE f.FooId IN (
    SELECT fb.FooId
    FROM FooBar fb
    WHERE fb.BarId = 1000
)

Любая помощь будет принята с благодарностью.

Спасибо.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
54
0
74 660
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Попробуйте выполнить два отдельных шага:

// create a Dictionary / Set / Collection fids first
var fids = (from fb in FooBar
            where fb.BarID = 1000
            select new { fooID = fb.FooID, barID = fb.BarID })
            .ToDictionary(x => x.fooID, x => x.barID);

from f in Foo
where fids.HasKey(f.FooId)
select f

from f in Foo
    where f.FooID ==
        (
            FROM fb in FooBar
            WHERE fb.BarID == 1000
            select fb.FooID

        )
    select f;

Попробуй это

var fooids = from fb in foobar where fb.BarId=1000 select fb.fooID
var ff = from f in foo where f.FooID = fooids select f
Ответ принят как подходящий

Взгляните на Эта статья. По сути, если вы хотите получить эквивалент IN, вам нужно сначала построить внутренний запрос, а затем использовать метод Contains (). Вот моя попытка перевода:

var innerQuery = from fb in FoorBar where fb.BarId = 1000 select fb.FooId;
var result = from f in Foo where innerQuery.Contains(f.FooId) select f;

Спасибо за ссылку - это как раз то, что мне нужно. Спасибо всем за ответы.

Ian Oxley 09.09.2008 13:24

У вас может быть более высокая производительность при создании словаря с первым запросом, поскольку вызов Contains () во втором запросе может быть выполнен в O (1), а не в O (n).

Daren Thomas 09.09.2008 16:03

Дарен, LINQ to SQL будет преобразован в SQL-запрос. Словарь будет полезен при итерации по коллекции объектов.

aku 10.09.2008 05:19

@Samuel_Jack Как я могу использовать это в LinqDatasource?

Simua 19.08.2014 12:41

Ссылка теперь мертва, и ответ гораздо менее полезен. Было бы лучше, если бы этот ответ содержал больше информации из связанной статьи, именно для предотвращения этой ситуации.

Marc Dingena 04.06.2018 12:20

Большое спасибо :)

Bilal 28.03.2020 09:52

Общий способ реализации IN в LINQ to SQL

var q = from t1 in table1
        let t2s = from t2 in table2
                  where <Conditions for table2>
                  select t2.KeyField
        where t2s.Contains(t1.KeyField)
        select t1;

Общий способ реализации EXISTS в LINQ to SQL

var q = from t1 in table1
        let t2s = from t2 in table2
                  where <Conditions for table2>
                  select t2.KeyField
        where t2s.Any(t1.KeyField)
        select t1;

Быстро и по делу - отличный ответ. Несмотря на то, что создание внутреннего запроса в отдельном операторе определенно ясно, можно также знать, как сделать это встроенным. Спасибо!

Jason Bunting 14.10.2009 05:04

@aku Этот метод предпочтительнее метода @Samuel Jack?

Brian Webster 11.07.2011 23:59

Это гораздо более читабельно, чем синтаксис цепочки методов. Спасибо.

Burak Karakuş 14.07.2016 12:03

Спасибо за запрос !! Незначительное наблюдение: в vb оператор запроса справа от t2s = должен быть заключен в квадратные скобки. Я в vs2013

glant 16.09.2016 18:01

var foos = Foo.Where<br>
( f => FooBar.Where(fb.BarId == 1000).Select(fb => fb.FooId).Contains(f.FooId));

// сначала создаем фиды Dictionary / Set / Collection

Найти другие артиллерийские орудия

var fids = (from fb in FooBar
            where fb.BarID = 1000
            select new { fooID = fb.FooID, barID = fb.BarID })
            .ToDictionary(x => x.fooID, x => x.barID);

from f in Foo
where fids.HasKey(f.FooId)
select f

// сначала создаем фиды Dictionary / Set / Collection

Найти другие артиллерийские орудия

var fids = (from fb in FooBar where fb.BarID = 1000 select new { fooID = fb.FooID, barID = fb.BarID }) .ToDictionary(x => x.fooID, x => x.barID);

from f in Foo where fids.HasKey(f.FooId) select f

from f in foo
where f.FooID equals model.FooBar.SingleOrDefault(fBar => fBar.barID = 1000).FooID
select new
{
f.Columns
};

Другие вопросы по теме