如何强制Linq使用SQL不使用缓存?

时间:2008-11-18 22:37:33

标签: linq-to-sql

当我进行两次相同的查询时,第二次它不会从数据库返回新行(我猜它只是使用缓存)。

这是一个Windows窗体应用程序,我在应用程序启动时创建dataContext。

如何强制Linq使用SQL不使用缓存?

以下是我遇到问题的示例函数:

public IEnumerable<Orders> NewOrders()
{
    return from order in dataContext.Orders
           where order.Status == 1
           select order; 
}

2 个答案:

答案 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的范围。