您可以查询最近添加的对象而不调用SubmitChanges吗?
本文关键字:调用 SubmitChanges 对象 查询 最近 添加 | 更新日期: 2023-09-27 18:17:28
在不深入我的应用程序的细节的情况下,我很好奇这在linq-to-sql中是否可能。
我可以写LINQ语句来查看数据库中的记录和最近使用InsertOnSubmit方法调用添加的记录吗?我试图写一个存在方法,它似乎只工作,如果我已经调用SubmitChanges方法。因此,它似乎只查看数据库中的记录,而不是内存中的记录。
是唯一的方法来完成这是先检查数据库(使用LINQ),然后检查变更集(使用GetChangeset)插入集合?
我意识到linq-to-sql不会将我的SQL优化成一个语句,但对我来说,在我的循环之外调用一个SubmitChanges代码会更干净。
感谢您的宝贵时间。
不,仅仅使用一个简单的Linq-to-Sql查询是不可能得到您想要的。你必须绕过它,而用一般的方法是很难做到这一点的。
但是,如果您只想连接来自DB的结果和添加到DataContext中的实体,那么像这样如何:
代替:
db.Orders.Where (o => o.OrderDate > DateTime.Now);
你写的
:
// Or put the method on DataContext as an extension method
var queryFunc = GetCombinedQuery (db, d => d.Orders, os => os.Where (o => o.OrderDate > DateTime.Now));
使用以下帮助器:
IQueryable<TResult> GetCombinedQuery<T, TResult> (DataContext dataContext, Func<DataContext, IQueryable<T>> dbQueryableProvider, Func<IQueryable<T>, IQueryable<TResult>> queryProvider)
{
var dbDataSource = dbQueryableProvider (dataContext);
var dbQuery = queryProvider (dbDataSource);
var inMemorySource = dataContext.GetObjectStateEntries (EntityState.Added).Select (e => e.Entity).OfType<T>();
var inMemoryQuery = queryProvider (inMemorySource);
return dbQuery.Concat (inMemoryQuery);
}
我可以写一个LINQ语句来查看数据库和最近添加的记录InsertOnSubmit方法调用?
不,如果你想把它从盒子里拿出来。
请记住,使用Linq-to-SQL, sql select语句被发送到数据库服务器并在那里执行。
Entity-Framework为它处理的每个对象维护一个状态,以便跟踪变化。
考虑到这个事实,您可以轻松地在ObjectContect
中查询添加状态对象:
using(var context = new yourDataContext())
{
var recentlyAddedObjects = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added);
var addedObjects = recentlyAddedObjects.Select(entry => entry.Entity)
.OfType<ResourceType>().ToList();
}
不要忘记将ResourceType
类型更改为实际的Type
。
阅读对象状态的一个很好的资源是:对象状态和更改跟踪