您可以查询最近添加的对象而不调用SubmitChanges吗?

本文关键字:调用 SubmitChanges 对象 查询 最近 添加 | 更新日期: 2023-09-27 18:17:28

在不深入我的应用程序的细节的情况下,我很好奇这在linq-to-sql中是否可能。

我可以写LINQ语句来查看数据库中的记录和最近使用InsertOnSubmit方法调用添加的记录吗?我试图写一个存在方法,它似乎只工作,如果我已经调用SubmitChanges方法。因此,它似乎只查看数据库中的记录,而不是内存中的记录。

是唯一的方法来完成这是先检查数据库(使用LINQ),然后检查变更集(使用GetChangeset)插入集合?

我意识到linq-to-sql不会将我的SQL优化成一个语句,但对我来说,在我的循环之外调用一个SubmitChanges代码会更干净。

感谢您的宝贵时间。

您可以查询最近添加的对象而不调用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

阅读对象状态的一个很好的资源是:对象状态和更改跟踪