Как вы можете обработать подзапрос IN с LINQ to SQL? - PullRequest
52 голосов
/ 09 сентября 2008

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

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

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

Спасибо.

Ответы [ 9 ]

82 голосов
/ 09 сентября 2008

Общий способ реализации 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;
58 голосов
/ 09 сентября 2008

Посмотрите на эту статью . По сути, если вы хотите получить эквивалент 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;
3 голосов
/ 09 сентября 2008
from f in Foo
    where f.FooID ==
        (
            FROM fb in FooBar
            WHERE fb.BarID == 1000
            select fb.FooID

        )
    select f;
2 голосов
/ 09 сентября 2008

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

// 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
1 голос
/ 06 июля 2009

// сначала создаем словарь / набор / коллекцию фидов

Найти другие артиллерии

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
0 голосов
/ 23 января 2012
from f in foo
where f.FooID equals model.FooBar.SingleOrDefault(fBar => fBar.barID = 1000).FooID
select new
{
f.Columns
};
0 голосов
/ 06 июля 2009

// сначала создаем словарь / набор / коллекцию фидов

Найти другие артиллерии

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
0 голосов
/ 15 сентября 2008
var foos = Foo.Where<br>
( f => FooBar.Where(fb.BarId == 1000).Select(fb => fb.FooId).Contains(f.FooId));
0 голосов
/ 09 сентября 2008

Попробуйте это

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...