Linq to实体:如何做一个子查询

时间:2009-11-03 01:12:12

标签: c# .net linq linq-to-entities

如何使用Linq To Entities进行此查询

SELECT * FROM TableA 
WHERE MyID IN 
(
    SELECT MyID 
    FROM TableB
)

问题是TableB不作为实体存在,因为它只包含其他表的外键,并且TableA和TableB之间没有直接链接

2 个答案:

答案 0 :(得分:1)

如果没有TableB是一个实体,我不知道你能做什么。如果你确实使TableB成为一个实体,那么它就在你的模型中,你应该能够做如下的事情(不确定这是否完全正确,但概念应该是合理的):

var tableAResults = from ta in db.TableA
                    where 
                    (
                        from tb in db.TableB 
                        select db.MyID
                    ).Contains(ta.MyID)
                    select ta;

如果您使用的是EF v1.0,则此类查询可能无效。 EF v1.0对它支持的linq查询有一些重大限制,它的SQL生成器很糟糕。我没有像使用v1.0那样使用EF v4.0(来自.NET 4.0测试版)的经验,但我相信上面的查询应该是可行的,它应该被翻译成与你非常相似的东西'原始SQL查询。

(如果您使用的是EF v1.0,请尽快迁移到EF v4.0,并在.NET 4.0 / VS2010发布后准备好了.EF v1.0有无数令人讨厌的限制,怪癖,愚蠢的规则,等等,只是让它成为一个使用的nitemare ......与某些相比,这个规则相当温和。)

答案 1 :(得分:0)

假设TableB没有出现,因为它是TableA和某些TableC之间多对多关系的一部分(你的问题对我来说唯一的方式),你会这样做:

var q = from a in Context.TableA
        where a.TableC.Any() // replace "TableC" with the relationship property name
        select a;

很简单,但你需要了解这些关系是如何运作的。