微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查具有相同外键的多行并逐步更新它们

如何解决如何检查具有相同外键的多行并逐步更新它们

我试着解释我的问题。

我的数据库中有一个表,其中有不止一行具有相同的 FK(Foreinkey),每行都有列 IDGuestUserNameGuestUserImageGuestFrameMaleFemaleFK_PartyFK_User。除 IdFK_Party 之外的所有列都有一个标准值。 FK_User 认设置为 null(请参阅我的 Party_Guest_TBL)。 那是我参加派对的认客人。现在,如果我尝试以用户身份加入这个聚会,我想检查 FK_User 的值是否仍然是 null 以及是否使用来自用户UserId 更新值。

My Party_Guest_TBL

var guestNumber = await _db.Party_GuestNumber_TBL.FirstOrDefaultAsync(x => x.FK_Party == PartyId);
        var partyGuest = await _db.Party_Guest_TBL.FirstOrDefaultAsync(x => x.FK_Party == PartyId);
        var user = await _db.User_TBL.FirstOrDefaultAsync(x => x.Id == UserId);
        var gender = await _db.Gender_TBL.FirstOrDefaultAsync(x => x.FK_User == UserId);

        if (partyGuest.FK_Party == PartyId && partyGuest.FK_User == null && partyGuest.Male == gender.Male)
        {

            partyGuest.FK_User = user.Id;
            partyGuest.GuestUserName = user.UserName;
            partyGuest.GuestimageUrl = user.ImageUrl;
            partyGuest.GuestFrame = user.Frame;

        }

这很好用,但我的问题是这段代码只检查第一行,而不检查其他行。这意味着一次只能更新一行。但我想逐步检查每一行,直到每个 FK_User 列都更新了 UserId。

解决方法

编辑:考虑更多,我认为您的系统设置需要评估。为什么 PartyGuests 表有很多行带有 User_FK==null?听起来很奇怪。

但无论如何,这就是我认为您明确问题的答案的总体思路。

假设有一个(正确搭建的)用户表需要添加

var userIds = new int[]{1,2,3,4};
var users = await _db.User_TBL
    .Include(u => u.Gender)
    .Where(u => userIds.Contains(u.Id) &&
                u.Gender == Gender.Male)
    .AsNoTracking();

现在您可以将它们添加到聚会中(假设有足够的空位置)

var nullPartyGuests = await _db.Party_Guest_TBL
    .Where(pg => pg.FK_Party == PartyId &&
                 pg.FK_User == null)
    .GetEnumerator(); // with tracking
foreach(var user in users) {
    var partyGuest = nullPartyGuests.Current;
    //your stuff
            partyGuest.FK_User = user.Id;
            partyGuest.GuestUserName = user.UserName;
            partyGuest.GuestImageUrl = user.ImageUrl;
            partyGuest.GuestFrame = user.Frame;
    // increase enumerator
    nullPartyGuests.MoveNext();
}
// then save everything to the DB.
await _db.SaveChanges();

注意,未测试

,

我自己喜欢它。

 var guestNumber = await _db.Party_GuestNumber_TBL.FirstOrDefaultAsync(x => x.FK_Party == PartyId);
        var user = await _db.User_TBL.FirstOrDefaultAsync(x => x.Id == UserId);
        var gender = await _db.Gender_TBL.FirstOrDefaultAsync(x => x.FK_User == UserId);

        var partyGuest = _db.Party_Guest_TBL.Where(x => x.FK_Party == PartyId && x.FK_User == null);

        var maleGuest = partyGuest.FirstOrDefault(x => x.FK_User == null && x.Male == gender.Male);
        var femaleGuest = partyGuest.FirstOrDefault(x => x.FK_User == null && x.Female == gender.Female);

        var alreadyJoined = _db.Party_Guest_TBL.Where(u => u.GuestUserName == user.UserName).SingleOrDefault();

        if (alreadyJoined != null)
        {
            return BadRequest("This User already join the party");
        }
        else if (maleGuest.Male == gender.Male)
        {
            maleGuest.FK_User = user.Id;
            maleGuest.GuestUserName = user.UserName;
            maleGuest.GuestImageUrl = user.ImageUrl;
            maleGuest.GuestFrame = user.Frame;
        }
        else if (femaleGuest.Female == gender.Female)
        {
            femaleGuest.FK_User = user.Id;
            femaleGuest.GuestUserName = user.UserName;
            femaleGuest.GuestImageUrl = user.ImageUrl;
            femaleGuest.GuestFrame = user.Frame;
        }

        _db.SaveChanges();

@JHBonarius 感谢您帮助我编写代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?