当我进行两次相同的查询时,第二次它不会从数据库返回新行(我猜它只是使用缓存)。
这是一个Windows窗体应用程序,我在应用程序启动时创建dataContext。
如何强制Linq使用SQL不使用缓存?
以下是我遇到问题的示例函数:
public IEnumerable<Orders> NewOrders()
{
return from order in dataContext.Orders
where order.Status == 1
select order;
}
答案 0 :(得分:10)
最简单的方法是使用新的DataContext - 假设上下文提供的大部分内容是缓存和身份管理,听起来你只是想要一个新的上下文。为什么你只想创建一个然后坚持下去?
顺便说一句,对于像你这样的简单查询,使用“普通”C#和扩展方法而不是查询表达式更具可读性(IMO):
public IEnumerable<Orders> NewOrders()
{
return dataContext.Orders.Where(order => order.Status == 1);
}
编辑:如果从不希望它跟踪更改,请在执行任何操作之前将ObjectTrackingEnabled设置为false。但是,这将严重限制其有用性。你不能只是前后翻转开关(在两者之间进行查询)。改变你的设计以避免单身上下文会好得多,IMO。
答案 1 :(得分:0)
如何向DataContext添加一个对象,以确定它是否会包含在将来的查询中。
不会将新的InventoryTransaction添加到内存查询中的未来
在这个例子中,我添加了一个带有ID的对象,然后将其添加到上下文中。
var transaction = new InventoryTransaction()
{
AdjustmentDate = currentTime,
QtyAdjustment = 5,
InventoryProductId = inventoryProductId
};
dbContext.InventoryTransactions.Add(transaction);
dbContext.SubmitChanges();
Linq-to-SQL不够聪明,不能将其视为需要添加到InventoryTransactions
中以前缓存的内存项列表中。
将新的InventoryTransaction添加到内存查询中的未来
var transaction = new InventoryTransaction()
{
AdjustmentDate = currentTime,
QtyAdjustment = 5
};
inventoryProduct.InventoryTransactions.Add(transaction);
dbContext.SubmitChanges();
在创建关系而不是ID时,尽可能使用Linq-to-SQL中的集合。
此外,正如Jon所说,尽量尽量减少DataContext的范围。