0

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

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

完成此操作的唯一方法是首先检查数据库(使用 LINQ)然后检查变更集(使用 GetChangeset)插入集合吗?

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

谢谢你的时间。

4

2 回答 2

1

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

不,如果你想开箱即用。

请记住,使用 Linq-to-SQL 会向数据库服务器发送一条 sql 选择语句并在那里执行

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.

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

于 2013-06-06T19:57:27.583 回答
1

不,仅使用一个简单的 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);
}
于 2013-06-06T20:09:12.230 回答