如果没有深入了解我的应用程序的细节,我很好奇是否在linq-to-sql中甚至可以实现。
我是否可以编写LINQ语句来查看数据库中的记录和最近使用InsertOnSubmit方法调用添加的记录?我正在尝试编写一个 Exists 方法,如果我调用了 SubmitChanges 方法,它似乎才有效。因此,它似乎只是查看数据库中的记录而不是内存中的记录。
实现此目的的唯一方法是先检查数据库(使用LINQ)然后检查更改集(使用GetChangeset)插入集合吗?
我意识到linq-to-sql不会将我的SQL优化为一个语句,但对我来说,代码会更清晰,在我的循环之外有一个 SubmitChanges 调用。
感谢您的时间。
答案 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);
}