C# 如何在MVC控制器中使用Linq连接两个表

C# 如何在MVC控制器中使用Linq连接两个表,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我有两个具有1:n关系的sql数据库表。对于我的ASP.NET MVC解决方案,我启用了EF代码优先迁移,并建立了适当的DBContext和类 我想编写一个MVC控制器,将两个表连接起来,以便选择要在视图中显示的特定记录 以下是两个类: public class Tbl_Group_Communities : Entity { public string GKZ { get; set; } public int G_ID { get; set; } }

我有两个具有1:n关系的sql数据库表。对于我的ASP.NET MVC解决方案,我启用了EF代码优先迁移,并建立了适当的DBContext和类

我想编写一个MVC控制器,将两个表连接起来,以便选择要在视图中显示的特定记录

以下是两个类:

        public class Tbl_Group_Communities : Entity
{
    public string GKZ { get; set; }
    public int G_ID { get; set; }
}

    public class Katastralgemeinden : Entity
{
    public string KGNr { get; set; }
    public string KGName { get; set; }
    public string GKZ { get; set; }
    public string GemeindeName { get; set; }
}
到目前为止,我已经能够为表自己设计出一个工作控制器,但没有连接。在第一级工作控制器下方:

            public IEnumerable<Tbl_Group_Communities> Get()
    {
        var entities = UnitOfWork.GetAll<Tbl_Group_Communities>().ToList();
        return entities;
    }
public IEnumerable Get()
{
var entities=UnitOfWork.GetAll().ToList();
返回实体;
}
我想,加入Linq可以完成,但我不知道如何/从哪里开始。 两个表的公共键都是GKZ;因此,应该通过GKZ建立连接。然后我需要从连接的记录中选择特定的记录,其中G_ID=某个值

如果有人能给我一些帮助,我将非常感激。
Manu

您可以按如下所示进行内部连接

假设:希望您的表名类似于
Tbl\u Group\u Communities
katastalgemenden
。换句话说,与类名相同

from s in db.Tbl_Group_Communities
join sa in db.Katastralgemeinden on s.GKZ equals sa.GKZ
where s.G_ID == 1
select s

您可以在此处了解有关加入的更多信息:

我找到了答案-这是我的控制器:

using System.Linq;
using System.Web.Http;
using System.Web.Http.OData.Query;
using IndireKat.Data.Contracts;
using IndireKat.Data.Contracts.Entities;
using IndireKat.Shared.Framework.Security;

namespace Presentation.Host.Controllers
{
    public class KatastralgemeindenController : BaseODataController
    {
        private readonly IIdentityStorage identityStorage;

        public KatastralgemeindenController(IUnitOfWork unitOfWork, IIdentityStorage identityStorage)
        {
            UnitOfWork = unitOfWork;
            this.identityStorage = identityStorage;
        }

        [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
        public IQueryable<Katastralgemeinden> Get()
        {
            IIndireKatPrincipal indireKatPrincipal = identityStorage.GetPrincipal();

            var comunityIds = UnitOfWork.GetAll<UserGroup>()
                .Where(group => group.Id == indireKatPrincipal.GroupId)
                .SelectMany(group => group.Tbl_Group_Communities).Select(comunity => comunity.GKZ).ToList();

            IQueryable<Katastralgemeinden> result = null;

            if (comunityIds.Any())
            {
                result = UnitOfWork.GetAll<Katastralgemeinden>().Where(company => comunityIds.Contains(company.GKZ));
            }

            return result;
        }
    }
}
使用System.Linq;
使用System.Web.Http;
使用System.Web.Http.OData.Query;
使用IndireKat.Data.Contracts;
使用IndireKat.Data.Contracts.Entities;
使用IndireKat.Shared.Framework.Security;
命名空间Presentation.Host.Controllers
{
公共类KataStarlgeMeindController:BaseODataController
{
专用只读IIdentityStorage标识存储;
公共KATASTRALGEMEINDECONTROLLER(i工作单元工作单元,i身份存储标识存储)
{
UnitOfWork=UnitOfWork;
this.identityStorage=identityStorage;
}
[可查询(AllowedQueryOptions=AllowedQueryOptions.All)]
公共IQueryable Get()
{
IIndireKatPrincipal indireKatPrincipal=identityStorage.GetPrincipal();
var comUnityId=UnitOfWork.GetAll()
.Where(group=>group.Id==indireKatPrincipal.GroupId)
.SelectMany(group=>group.Tbl\u group\u Communities).Select(comunity=>comunity.GKZ).ToList();
IQueryable结果=null;
if(comUnityId.Any())
{
结果=UnitOfWork.GetAll(),其中(company=>comUnityId.Contains(company.GKZ));
}
返回结果;
}
}
}

您好,Manu

我相信有人可以告诉您如何加入,但我建议您研究如何配置。如果您使用导航属性设置适当的模型,那么它非常简单。我建议查看ViewModels。你是说你找不到任何关于如何编写
Join
语句的文档?除此之外,
UnitOfWork
能产生什么还不清楚。它是否也提供了Katastralgemeinden?如果是,那么
GetAll
返回什么?如果它是
IEnumerable
,那么加入一点效率都没有。我可以找到文档,但因为我对C#和MVC控制器非常陌生,所以文档比帮助更让人困惑。UnitOfWork也提供了Katastralgemeinden。我认为GetAll会返回所有记录,这只是检查一个表的控制器是否工作。有什么比IEnumerable更有效?如果将两个
IEnumerable
s连接起来,两个表的数据将通过两个查询(可能返回大量数据)被提取到内存中,然后在内存中连接起来。当您联接两个
IQueryable
(来自同一上下文)时,联接将转换为一个高效的SQL查询。