如何在LINQ中返回依赖于连接/子查询的表?

时间:2010-07-13 22:46:24

标签: linq linq-to-sql join subquery

我需要1个表中的字段取决于1个属性匹配另一个表中的行。 我可以使用子查询在SQL中编写此查询:

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
}

我也试过在.Select部分创建一个Table1,但是我得到了一个关于不允许显式构造的错误。

为了澄清一下,我希望能够返回Table1类型的IQueryable,看起来我应该可以做而不必创建UnnecessaryObject ...但我仍然是LINQ的新手,所以我很感激您提供的任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:3)

你可以这样做:

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

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

答案 1 :(得分:2)

我能提出的原始查询的最佳翻译是:

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

这将选择Table1中的所有项目,其中有Property1Property0 == 0Table2来自RelatedItems

它也可以通过连接来解决。要获得有效的连接,您需要在两个表之间建立关系。然后你可以做一些事情,比如假设关系被称为from item in context.Table1 join relatedItem in item.RelatedItems on item.Property1 equals relatedItem.Property where relatedItem.Property0 == 0 select item

SELECT * 
FROM Table1
JOIN Table2 ON Table1.Property1 = Table2.Property1
WHERE Table2.Property0 = 0

这相当于SQL:

{{1}}