Как вернуть таблицу в LINQ, основанную на соединении / подзапросе? - PullRequest
1 голос
/ 14 июля 2010

Мне нужно, чтобы поля в 1 таблице зависели от 1 свойства, совпадающего со строками в другой таблице.Я могу написать этот запрос на SQL с подзапросом как таковым:

SELECT *
FROM Table1
WHERE Property1 IN
(
    SELECT Property1
    FROM Table2
    WHERE Property0 = 1
)

Но я читаю здесь , что это менее сложно и так же просто написать с объединением, что я и сделал.Однако до сих пор я не могу вернуть только Table1, как мне хотелось бы, поскольку я использую соединение, которое, если я не ошибаюсь, требует от меня создания этого анонимного типа, как показано ниже.То, что я здесь сделал, работает (я создал еще один объект с теми же свойствами, что и в Table1, которые мне нужны), но я не могу не думать, что есть лучший способ сделать это.

Table1.Join(Table2, t1 => t1.Property1, t2 => t2.Property1, (t1, t2) => new
{
    t1.Property1,
    t1.Property2,
    t1.Property3
})
.Select(ob => new UnnecessaryObject
{
    Property1 = ob.Property1,
    Property2 = ob.Property2,
    Property3 = ob.Property3
}

Я также попытался просто создатьTable1 в части .Select, но я получил ошибку о том, что явное конструирование не разрешено.

Просто чтобы уточнить, я хотел бы иметь возможность вернуть IQueryable типа Table1, что, как мне кажется, мне следуетчтобы иметь возможность обойтись без создания UnneededObject ... но я все еще довольно новичок в LINQ, поэтому я был бы признателен за любую помощь, которую вы можете предложить.Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 14 июля 2010

Вы можете просто сделать:

from t1 in table1
join t2 in table2 on t1.property1 equals t2.property1
select t1;

Это вернет коллекцию объектов table1.Это предполагает, что из вашего примера table1 - это коллекция объектов table1, а table2 - это коллекция объектов table2.

2 голосов
/ 14 июля 2010

Лучший перевод вашего оригинального запроса, который я могу придумать:

from item in context.Table1
where context.Table2
    .Where(x => x.Property0 == 0)
    .Any(x => x.Property1 == item.Property1)
select item

Выбирает все элементы из Table1, где есть элементы с совпадающими Property1 и Property0 == 0 из Table2

Это также можно решить с помощью объединения. Чтобы получить эффективное соединение, вы должны иметь связь между двумя таблицами. Тогда вы можете сделать что-то вроде предположения, что отношение называется RelatedItems:

from item in context.Table1
join relatedItem in item.RelatedItems
    on item.Property1 equals relatedItem.Property
where relatedItem.Property0 == 0

select item

Это эквивалентно SQL:

SELECT * 
FROM Table1
JOIN Table2 ON Table1.Property1 = Table2.Property1
WHERE Table2.Property0 = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...