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

C# 您可以查询最近添加的对象而不调用SubmitChanges吗?,c#,linq-to-sql,C#,Linq To Sql,在不深入了解我的应用程序细节的情况下,我很好奇在LINQtoSQL中是否可能实现这一点 我可以写一个LINQ语句来查看数据库中的记录和最近使用InsertOnSubmit方法调用添加的记录吗?我正在尝试编写一个Exists方法,只有在调用SubmitChanges方法的情况下,该方法才有效。因此,它似乎只查看数据库中的记录,而不是内存中的记录 实现这一点的唯一方法是先检查数据库(使用LINQ),然后检查变更集(使用GetChangeset)inserts集合吗 我意识到linq to sql不会

在不深入了解我的应用程序细节的情况下,我很好奇在LINQtoSQL中是否可能实现这一点

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

实现这一点的唯一方法是先检查数据库(使用LINQ),然后检查变更集(使用GetChangeset)inserts集合吗

我意识到linq to sql不会将我的sql优化为一条语句,但对我来说,在循环之外调用一次SubmitChanges会使代码更干净

谢谢你抽出时间

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

不,如果你想从盒子里拿出来的话

请记住,使用LINQtoSQL时,将向数据库服务器发送一条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();
}
使用(var context=new yourDataContext())
{
var recentlyaddededobjects=context.ObjectStateManager.GetObjectStateEntries(EntityState.Added);
var addedObjects=recentlyAddedObjects.Select(entry=>entry.Entity)
.OfType().ToList();
}
不要忘记将
ResourceType
类型更改为您真正的
类型


阅读对象状态的一个很好的资源是:

不,仅仅使用一个简单的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);
}
IQueryable GetCombinedQuery(DataContext DataContext、Func dbQueryableProvider、Func queryProvider)
{
var dbDataSource=dbQueryableProvider(dataContext);
var dbQuery=queryProvider(dbDataSource);
var inMemorySource=dataContext.GetObjectStateEntries(EntityState.Added).Select(e=>e.Entity).OfType();
var inMemoryQuery=queryProvider(inMemorySource);
返回dbQuery.Concat(inMemoryQuery);
}

这在linq到sql中是否有效?您建议的代码似乎是linq到实体,而不是linq到sql。我还想找到一种方法来查询最近添加的对象(内存中)和数据库中已经存在的对象。我希望这只是我缺少的一个上下文配置选项什么的。当然,阅读此文:如果没有编程干预,开箱即用地获取内存对象和数据库对象是不可能的-请记住,使用Linq to SQL,select语句将被发送到数据库服务器并在那里执行。我决定保持我的代码在添加记录到两个表中的一个。这样,我的Exists LINQ查询将始终按预期工作。这样做更容易,然后尝试同时包含数据库中的记录和将要保存到数据库中的记录。不幸的是,没有更简单的方法来处理这个问题。我只是假设当我使用InsertOnSubmit添加记录时,它会在我执行LINQ查询时被包括在内,但现在我知道了其他情况。我将您的问题标记为答案,因为它与我正在寻找的答案最接近,即使我没有使用它。谢谢