c# - 在dbset中查找没有主键的记录

标签 c# entity-framework

我有一个 Student 表,其中我使用 Find 找到了一条主键为 UserID 的记录

        var currentUserId = User.Identity.GetUserId();
        var newid = db.Students.FirstOrDefault(d => d.UserID == currentUserId);

        if (newid == null)
        {
            newid = db.Students.Create();
            newid.UserID = currentUserId;
            db.Students.Add(newid);

        }

        Student student = db.Students.Find(newid.UserID);
        if (student == null)
        {
            return HttpNotFound();
        }

我的问题是如何找到一条记录但不能使用他的主键?在我的例子中,我的 IndividualInventoryRecord 有主键 RecordID。我想使用 FK UserID

从该表中查找记录

我试过了,但是 inventory 返回 null

var userInv = db.IndividualInventoryRecords.FirstOrDefault(d => d.UserID == currentUserId);

        if (userInv == null)
        {
            userInv = db.IndividualInventoryRecords.Create();
            userInv.UserID = currentUserId;
            db.IndividualInventoryRecords.Add(userInv);
        }

        IndividualInventoryRecord inventory = db.IndividualInventoryRecords.FirstOrDefault(user => user.UserID == currentUserId);

        if (inventory == null)
        {
            return HttpNotFound();
        }

我也试过使用 SingleOrDefault()

最佳答案

不幸的是,Find 方法是唯一考虑本地缓存的方法。所有标准的 Queryable 方法都被翻译成 SQL 并在数据库中执行,因此只返回现有的数据库表记录。

然而,编写您自己的自定义扩展方法并不难,类似于 Find 但带有谓词表达式:

public static partial class DbSetExtensions
{
    public static T FindFirst<T>(this DbSet<T> source, Expression<Func<T, bool>> predicate)
        where T : class
    {
        return source.Local.AsQueryable().FirstOrDefault(predicate) ?? source.FirstOrDefault(predicate);
    }
}

并使用它代替 FirstOrDefault:

var inventory = db.IndividualInventoryRecords.FindFirst(e => e.UserID == currentUserId);

关于c# - 在dbset中查找没有主键的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47892391/

相关文章:

c# - 将实时数据发布到 Excel

c# - 模块化网站设计,使用 ASP.NET MVC,我想要一个不那么单一的设计

c# - 网站发布过程中未在项目中找到数据库

c# - 将数据行传递给表单并将控件绑定(bind)到它

C# 事件处理程序

c# - Entity Framework - 多个数据库连接

sql - 使用包含多个选项的 Entity Framework 查询

wcf - mvc3 中使用 WCF 服务获取数据的性能技术

c# - 使用 ServiceStack 返回具有特定状态代码的自定义 DTO 的选项有哪些?

c# - 使用 ClientWebSocket .net 核心测试 TestHost.WebSocketClient