Как мне вернуть в LINQ таблицу, основанную на соединении / подзапросе?

Мне нужны поля в 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, поэтому я Буду признателен за любую помощь, которую вы можете предложить. Заранее спасибо.


person Andy    schedule 13.07.2010    source источник


Ответы (2)


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

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

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

person Ben Robinson    schedule 13.07.2010
comment
Сработало отлично! Большое спасибо! - person Andy; 14.07.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
person Sander Rijken    schedule 13.07.2010
comment
Сработало отлично! Большое спасибо! - person Andy; 14.07.2010