【问题标题】:How to join two tables with Linq in an MVC controller如何在 MVC 控制器中使用 Linq 连接两个表
【发布时间】:2023-03-11 08:50:01
【问题描述】:

我有两个 1:n 关系的 sql 数据库表。对于我的 ASP.NET MVC 解决方案,我启用了 EF-code-first-migration 并建立了正确的 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;
    }

我认为,可以使用 Linq 完成连接,但我不知道如何/从哪里开始。 两个表的共同键是 GKZ;所以应该通过 GKZ 建立连接。然后我需要从 G_ID = 某个值的连接记录中选择特定记录。

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

【问题讨论】:

  • 我相信有人可以告诉你如何进行连接,但我建议你研究一下如何配置code first relationships。如果您使用导航属性设置正确的模型,则非常简单。我建议查看 ViewModel。
  • 您的意思是您找不到任何有关如何编写Join 语句的文档?除此之外,尚不清楚UnitOfWork 可以产生什么。是否也提供Katastralgemeinden?如果是这样,GetAll 会返回什么?如果是IEnumerable,加入根本就没有效率。
  • 我可以找到文档,但由于我对 C# 和 MVC 控制器非常陌生,因此文档比帮助更令人困惑。 UnitOfWork 也提供 Katastralgemeinden。我认为 GetAll 确实返回了所有记录,这只是检查控制器是否工作的一个表。什么比 IEnumerable 更有效?
  • 如果你连接两个IEnumerables,两个表的数据将被两个查询(可能返回大量数据)提取到内存中,然后连接到内存中。当您连接两个IQueryable(来自同一上下文)时,连接将被转换为一个高效的 SQL 查询。

标签: c# sql-server entity-framework linq


【解决方案1】:

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

假设:希望您的表名类似于Tbl_Group_CommunitiesKatastralgemeinden。换句话说,与类名相同。

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

您可以在此处了解有关join 的更多信息:Join Operators

【讨论】:

    【解决方案2】:

    我想通了 - 这是我的控制器工作:

    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;
            }
        }
    }
    

    问候,马努

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      相关资源
      最近更新 更多