【问题标题】:Get 1 record from 2 tables ASP.NET从 2 个表 ASP.NET 中获取 1 条记录
【发布时间】:2018-08-27 21:39:52
【问题描述】:

我仍然是 ASP.NET 业余爱好者,我一直在开发一个应用程序,如果没有发生特殊事件(例如,员工生病了),我需要计算员工的工作时间,我的表中有 2 个表数据库,1 与员工。和第二张桌子,其中包含事件。事件表通过日历填充,并包含日期和事件发起人等信息。

我的情况: 当用户单击员工的详细信息页面时。我想要该员工的相应记录,以及他所做的事件。所以我假设我正在寻找与 linq 的联接。

一名员工可以进行超过 1 次活动,假设一名员工本月需要加班 3 天。然后在详细信息页面上,它应该从员工表中选择员工,并从事件表中选择 3 个事件。

更新

感谢 Vladimir 的帮助,很多错误都消失了,并且查询正常工作。虽然它还没有完全按预期工作。它目前返回 1 名员工和 1 个事件。虽然我正在测试的员工应该返回 4 个事件。

这是我的上下文

namespace hrmTool.Models
{
public class MedewerkerMeldingContext : DbContext
{
    public MedewerkerMeldingContext() : base("name=temphrmEntities") { }
    public DbSet<medewerker> medewerker { get; set; }
    public DbSet<medewerker_melding> medewerker_melding { get; set; }
}
}

我当前的视图模型

namespace hrmTool.Models
{
public class MedewerkerMeldingViewModel
{
    //Medewerker tabel
    public int ID { get; set; }
    public string roepnaam { get; set; }
    public string voorvoegsel { get; set; }
    public string achternaam { get; set; }
    public string tussenvoegsel { get; set; }
    public string meisjesnaam { get; set; }
    public Nullable<System.DateTime> datum_in_dienst { get; set; }
    public Nullable<System.DateTime> datum_uit_dienst { get; set; }
    public int aantal_km_woon_werk { get; set; }
    public bool maandag { get; set; }
    public Nullable<System.TimeSpan> ma_van { get; set; }
    public Nullable<System.TimeSpan> ma_tot { get; set; }
    public bool dinsdag { get; set; }
    public Nullable<System.TimeSpan> di_van { get; set; }
    public Nullable<System.TimeSpan> di_tot { get; set; }
    public bool woensdag { get; set; }
    public Nullable<System.TimeSpan> wo_van { get; set; }
    public Nullable<System.TimeSpan> wo_tot { get; set; }
    public bool donderdag { get; set; }
    public Nullable<System.TimeSpan> do_van { get; set; }
    public Nullable<System.TimeSpan> do_tot { get; set; }
    public bool vrijdag { get; set; }
    public Nullable<System.TimeSpan> vr_van { get; set; }
    public Nullable<System.TimeSpan> vr_tot { get; set; }
    public bool zaterdag { get; set; }
    public Nullable<System.TimeSpan> za_van { get; set; }
    public Nullable<System.TimeSpan> za_tot { get; set; }
    public bool zondag { get; set; }
    public Nullable<System.TimeSpan> zo_van { get; set; }
    public Nullable<System.TimeSpan> zo_tot { get; set; }

    //Medewerker_Melding combi tabel
    public int medewerkerID { get; set; }
    public int meldingID { get; set; }
    public System.DateTime datum_van { get; set; }
    public Nullable<System.DateTime> datum_tot { get; set; }
    public int MM_ID { get; set; }
    public virtual ICollection<medewerker_melding> medewerker_melding { get; set; }

    public virtual medewerker medewerker { get; set; }
}
}

我当前的查询

using (var context = new MedewerkerMeldingContext())
        {



            var medewerkers = context.medewerker;
            var medewerker_meldings = context.medewerker_melding;

            var testQuery = from m in medewerkers
                            join mm in medewerker_meldings on m.ID equals mm.medewerkerID
                            where m.ID == id
                            select new MedewerkerMeldingViewModel
                            {
                                ID = m.ID,
                                roepnaam = m.roepnaam,
                                voorvoegsel = m.voorvoegsel,
                                achternaam = m.achternaam,
                                tussenvoegsel = m.tussenvoegsel,
                                meisjesnaam = m.meisjesnaam,
                                datum_in_dienst = m.datum_in_dienst,
                                datum_uit_dienst = m.datum_uit_dienst,
                                aantal_km_woon_werk = m.aantal_km_woon_werk,
                                maandag = m.maandag,
                                ma_van = m.ma_van,
                                ma_tot = m.ma_tot,
                                dinsdag = m.dinsdag,
                                di_van = m.di_van,
                                di_tot = m.di_tot,
                                woensdag = m.woensdag,
                                wo_van = m.wo_van,
                                wo_tot = m.wo_tot,
                                donderdag = m.donderdag,
                                do_van = m.do_van,
                                do_tot = m.do_tot,
                                vrijdag = m.vrijdag,
                                vr_van = m.vr_van,
                                vr_tot = m.vr_tot,
                                zaterdag = m.zaterdag,
                                za_van = m.za_van,
                                za_tot = m.za_tot,
                                zondag = m.zondag,
                                zo_van = m.zo_van,
                                zo_tot = m.zo_tot,
                                medewerkerID = mm.medewerkerID,
                                meldingID = mm.meldingID,
                                datum_van = mm.datum_van,
                                datum_tot = mm.datum_tot,
                                MM_ID = mm.ID
                            };

            var getQueryResult = testQuery.FirstOrDefault();

            Debug.WriteLine("Debug testQuery" + testQuery);
            Debug.WriteLine("Debug getQueryResult:   "+ getQueryResult);

            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            if (testQuery == null)
            {
                return HttpNotFound();
            }
            return View(getQueryResult);
        }

返回:1 个员工实例和只有 1 个事件

预期回报:1 个员工实例,4 个事件

【问题讨论】:

标签: c# linq asp.net-mvc-5


【解决方案1】:

在您的上下文中缺少DbContext - 因此Linq to Entity 无法找到相应的查询实现。并且 DbContext 也与 DbSets - 所以试试吧:

public class MedewerkerMeldingContext : DbContext
{
    public MedewerkerMeldingContext () : base(ConnectionStringKey)
    {

    };

    public DbSet<medewerker> medewerker { get; set; }
    public DbSet<medewerker_melding> medewerker_melding { get; set; }
}

然后

 using (var context = new MedewerkerMeldingContext())
        {



            var medewerkers = context.medewerker;
            var medewerker_meldings = context.medewerker_melding;

            var testQuery = from m in medewerkers
                            join mm in medewerker_meldings on m.ID equals mm.medewerkerID
                            where m.ID == id
                            select new MedewerkerMeldingViewModel
                            {
                                ID = m.ID,
                                roepnaam = m.roepnaam,
                                voorvoegsel = m.voorvoegsel,
                                achternaam = m.achternaam,
                                tussenvoegsel = m.tussenvoegsel,
                                meisjesnaam = m.meisjesnaam,
                                datum_in_dienst = m.datum_in_dienst,
                                datum_uit_dienst = m.datum_uit_dienst,
                                aantal_km_woon_werk = m.aantal_km_woon_werk,
                                maandag = m.maandag,
                                ma_van = m.ma_van,
                                ma_tot = m.ma_tot,
                                dinsdag = m.dinsdag,
                                di_van = m.di_van,
                                di_tot = m.di_tot,
                                woensdag = m.woensdag,
                                wo_van = m.wo_van,
                                wo_tot = m.wo_tot,
                                donderdag = m.donderdag,
                                do_van = m.do_van,
                                do_tot = m.do_tot,
                                vrijdag = m.vrijdag,
                                vr_van = m.vr_van,
                                vr_tot = m.vr_tot,
                                zaterdag = m.zaterdag,
                                za_van = m.za_van,
                                za_tot = m.za_tot,
                                zondag = m.zondag,
                                zo_van = m.zo_van,
                                zo_tot = m.zo_tot,
                                medewerkerID = mm.medewerkerID,
                                meldingID = mm.meldingID,
                                datum_van = mm.datum_van,
                                datum_tot = mm.datum_tot,
                                MM_ID = mm.ID
                            };
            Debug.WriteLine("Debug testQuery" + testQuery);

            var getQueryResult = testQuery.ToList();
            Debug.WriteLine("Debug getQueryResult:   " + getQueryResult);

            var resultDictionary = getQueryResult.GroupBy(x => x.ID).ToDictionary(y => y.Key, z => z.ToList());
            Debug.WriteLine("resultDictionary: " + resultDictionary);

            var firstItem = resultDictionary.Values.First();
            Debug.WriteLine("FirstItem: " + firstItem);

            var Entity = new newEntity
            {
                //ID = firstItem.ID,
                ID = firstItem.Select(x => x.ID).First(),
                roepnaam = firstItem.Select(x => x.roepnaam).First(),
                voorvoegsel = firstItem.Select(x => x.voorvoegsel).First(),
                achternaam = firstItem.Select(x => x.achternaam).First(),
                tussenvoegsel = firstItem.Select(x => x.tussenvoegsel).First(),
                meisjesnaam = firstItem.Select(x => x.meisjesnaam).First(),
                datum_in_dienst = firstItem.Select(x => x.datum_in_dienst).First(),
                datum_uit_dienst = firstItem.Select(x => x.datum_uit_dienst).First(),
                aantal_km_woon_werk = firstItem.Select(x => x.aantal_km_woon_werk).First(),
                maandag = firstItem.Select(x => x.maandag).First(),
                ma_van = firstItem.Select(x => x.ma_van).First(),
                ma_tot = firstItem.Select(x => x.ma_tot).First(),
                dinsdag = firstItem.Select(x => x.dinsdag).First(),
                di_van = firstItem.Select(x => x.di_van).First(),
                di_tot = firstItem.Select(x => x.di_tot).First(),
                woensdag = firstItem.Select(x => x.woensdag).First(),
                wo_van = firstItem.Select(x => x.wo_van).First(),
                wo_tot = firstItem.Select(x => x.wo_tot).First(),
                donderdag = firstItem.Select(x => x.donderdag).First(),
                do_van = firstItem.Select(x => x.do_van).First(),
                do_tot = firstItem.Select(x => x.do_tot).First(),
                vrijdag = firstItem.Select(x => x.vrijdag).First(),
                vr_van = firstItem.Select(x => x.vr_van).First(),
                vr_tot = firstItem.Select(x => x.vr_tot).First(),
                zaterdag = firstItem.Select(x => x.zaterdag).First(),
                za_van = firstItem.Select(x => x.za_van).First(),
                za_tot = firstItem.Select(x => x.za_tot).First(),
                zondag = firstItem.Select(x => x.zondag).First(),
                zo_van = firstItem.Select(x => x.zo_van).First(),
                zo_tot = firstItem.Select(x => x.zo_tot).First()
            };

            Debug.WriteLine("Entity: " + Entity);

            var plainValues = resultDictionary.Values.SelectMany(x => x).ToList();

            var resultSchedule = plainValues.Select(x => new medewerker_melding
            {
                medewerkerID = x.medewerkerID,
                meldingID = x.meldingID,
                datum_van = x.datum_van,
                datum_tot = x.datum_tot,
                ID = x.MM_ID
            }).ToList();

            Entity.medewerker_melding = resultSchedule;

}

【讨论】:

  • 当我这样做时,test1 == null
  • 好吧——但没有错误——只是一个空集?会解决的 - 等一下)
  • 尝试调试并查看 testquery 变量中的内容
  • 我不能在var test1 = from m in medewerkers 上收到一条错误消息Value can't be null. Parameter: outer
【解决方案2】:

您需要检查MedewerkerMeldingContext dbC = new MedewerkerMeldingContext(); 是否正在执行IEnumerable&lt;T&gt; 否则,您将无法在桌子上执行所需的操作。

这种错误(找不到查询的实现 模式) 通常发生在:

  • 您缺少 LINQ 命名空间使用 (using System.Linq)
  • 你查询的类型没有实现IEnumerable&lt;T&gt;

我的建议是,首先检查命名空间。 第二次检查IEnumerable&lt;T&gt; 实现。

您的查询足够好,您获取上下文并执行 linq,这里没有问题。 90% 的情况是你忘记了命名空间,因为 context 已经实现了 IEnumerable&lt;T&gt; 接口。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多