我有一个 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/