您可以在不调用SubmitChanges的情况下查询最近添加的对象吗?

时间:2013-06-06 19:37:19

标签: c# linq-to-sql

如果没有深入了解我的应用程序的细节,我很好奇是否在linq-to-sql中甚至可以实现。

我是否可以编写LINQ语句来查看数据库中的记录最近使用InsertOnSubmit方法调用添加的记录?我正在尝试编写一个 Exists 方法,如果我调用了 SubmitChanges 方法,它似乎才有效。因此,它似乎只是查看数据库中的记录而不是内存中的记录。

实现此目的的唯一方法是先检查数据库(使用LINQ)然后检查更改集(使用GetChangeset)插入集合吗?

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

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

  

我可以写一个LINQ语句来查看两个中的记录   最近使用的数据库和记录   InsertOnSubmit方法调用?

不,如果你想要它开箱即用。

请记住,使用Linq-to-SQL时,会将sql select语句发送到数据库服务器并执行

实体框架为其处理的每个对象维护一个状态,以便跟踪更改。

鉴于这一事实,您可以轻松查询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

阅读有关对象状态的好资源是:Object States and Change-Tracking

答案 1 :(得分:1)

不,只使用一个简单的Linq-to-Sql查询就不可能实现。你必须解决它,并且很难以通用的方式做到这一点。

但是,如果您只想连接数据库和添加到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);
}