Linq to sql 将Linq转换为Sql,并将JOIN转换为IQueryable select

Linq to sql 将Linq转换为Sql,并将JOIN转换为IQueryable select,linq-to-sql,iqueryable,service-layer,Linq To Sql,Iqueryable,Service Layer,我有一个名为GetUserByOpenId的函数,我根本不想使用这个函数 Public Function GetUserByOpenID(ByVal claimedidentifier As String) As User Implements IUserRepository.GetUserByOpenID Dim user = (From u In dc.Users Join o In dc.OpenIDs On u.ID Equ

我有一个名为
GetUserByOpenId
的函数,我根本不想使用这个函数

    Public Function GetUserByOpenID(ByVal claimedidentifier As String) As User Implements IUserRepository.GetUserByOpenID
        Dim user = (From u In dc.Users
                    Join o In dc.OpenIDs On u.ID Equals o.UserID
                    Where o.ClaimedIdentifier = claimedidentifier
                    Select u).FirstOrDefault
        Return user
    End Function
我真正想做的是使用我的“GetUsers”函数(IQueryable)并在我的服务层中进行连接

    Public Function GetUsers() As IQueryable(Of User) Implements IUserRepository.GetUsers
        Dim users = (From u In dc.Users
                    Select u)
        Return users.AsQueryable
    End Function
有谁能告诉我使用类似于此的函数返回适当数据的方法是什么样的吗

    Public Function GetAllUsers() As System.Collections.Generic.IList(Of User) Implements IUserService.GetAllUsers
        Return _UserRepository.GetUsers().Where(Function(u) (Not u.isClosed)).ToList
    End Function

嗯,看起来你应该在OpenID和用户之间建立FK关系,但是你没有。如果创建此关系,您将能够通过属性轻松遍历它,而不必进行任何查询(除了简单的Where之外)。

在DBML设计器(和sql server)中,OpenID和用户之间存在关系。然后,您的用户对象上应该有一个OpenID属性,您可以轻松遍历该属性。在大多数情况下,在.NET代码中不需要联接,因为对象之间的关系表示为对象图(成员引用)。