我需要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的新手,所以我很感激您提供的任何帮助。提前谢谢。
答案 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
中的所有项目,其中有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
:
SELECT *
FROM Table1
JOIN Table2 ON Table1.Property1 = Table2.Property1
WHERE Table2.Property0 = 0
这相当于SQL:
{{1}}