2010-07-13 19 views
1

我需要1个表中的字段,而不是1个属性匹配另一个表中的行。 我可以写在SQL这个查询与子查询这样:如何返回LINQ中依赖联接/子查询的表?

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

但我读here,它是那么复杂,也很容易用一个连接来写,我做到了。但是,到目前为止,我无法仅返回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 
} 

我也试过只是创造的。选择部分表1,但我没有被允许大约明确建设一个错误。

只是为了澄清,我希望能够返回Table类型的IQueryable,它似乎我应该能够做到而不必创建UnnecessaryObject ...但我仍然很新LINQ,所以我会很感激你能提供的任何帮助。提前致谢。

回答

3

你可能只是做:

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

,将返回table1的对象的集合。这从您的示例中假设table1是table1对象的集合,table2是table2对象的集合。

+0

工作太棒了!非常感谢! – Andy 2010-07-14 14:09:11

2

我可以拿出你的原始查询的最好的翻译是:

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

这从Table1,那里有来自Table2

它还可以选配Property1Property0 == 0是一个项目可以选择所有项目确实可以通过连接来解决。要获得有效的连接,您需要在两个表之间建立关系。然后,你可以不喜欢假设关系称为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 
+0

工作很好!非常感谢! – Andy 2010-07-14 14:10:16