如何解决LINQ to SQL和缓存
我在使用LINQ to SQL和缓存方面遇到了麻烦。 我已经在SO上找到了类似的问题,但是似乎没有一个问题涉及在应用程序外部修改db的情况。
假设我有一个Windows Forms应用程序,该应用程序使用户能够一次一天浏览一些只读数据。 这是我的代码的真正简化版本:
public partial class Form1 : Form
{
DateTime curDate = new DateTime(2001,1,1);
DataClasses1DataContext dc = new DataClasses1DataContext();
public Form1()
{
InitializeComponent();
dc.Log = Console.Out;
cmdPrev.Click += PrevNext;
cmdNext.Click += PrevNext;
}
private void Form1_Load(object sender,EventArgs e)
{
LoadValues();
}
private void PrevNext(object sender,EventArgs e)
{
var delta = sender == cmdPrev ? -1 : 1;
curDate = curDate.AddDays(delta);
LoadValues();
}
private void LoadValues()
{
var q = from v in dc.temptbl where v.Date == curDate select v;
// listBox is used for debugging only.
listBox1.Items.Clear();
foreach (var v in q)
{
listBox1.Items.Add(v.Value);
}
}
}
这是temptbl的初始值:
| Id | Value | Date
+-------+-------+------------
| 11105 | 1 | 01/01/2001
| 11106 | 2 | 01/01/2001
| 11107 | 3 | 02/01/2001
第一次运行时,输出控制台显示以下内容:
[t0].[id],[t0].[Value],[t0].[Date]
FROM [dbo].[temptbl] AS [t0]
WHERE [t0].[Date] = @p0
-- @p0: Input DateTime (Size = -1; Prec = 0; Scale = 0) [01/01/2001 00:00:00]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.8.4084.0
这很有道理。
在2001年1月1日,我具有以下值:[1、2]。
现在我要提前1天,然后手动添加(使用SSMS)新记录:[11108,4,01/01/2001]。 如果我返回,则现在具有值[1、2、4]。还可以。
我再次进行操作,然后将[11105, 1 ,01/01/2001]的值更改为[11105, 10 ,01/01/2001] 。 当我返回时,期望值为[ 10 ,2、4],但我仍然有[ 1 ,2、4]。
由于缓存,插入(和删除)的记录被正确跟踪,而修改后的记录不被刷新。
正如其他SO问题所建议的那样,我尝试使用 datacontext .Refresh,但是我不确定如何正确应用它。
如果我这样修改代码:
dc.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues,dc.temptbl);
var q = from v in dc.temptbl where v.Date == curDate select v;
或这种方式:
var q = from v in dc.temptbl where v.Date == curDate select v;
dc.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues,q);
结果是正确的,但这是我每次执行查询时在控制台输出中看到的结果(在2001年1月1日,不同日期的输出类似):
SELECT [t0].[id],[t0].[Date]
FROM [dbo].[temptbl] AS [t0]
WHERE [t0].[Date] = @p0
-- @p0: Input DateTime (Size = -1; Prec = 0; Scale = 0) [01/01/2001 00:00:00]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.8.4084.0
SELECT [t0].[id],[t0].[Date]
FROM [dbo].[temptbl] AS [t0]
WHERE [t0].[id] = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [11105]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.8.4084.0
SELECT [t0].[id],[t0].[Date]
FROM [dbo].[temptbl] AS [t0]
WHERE [t0].[id] = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [11106]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.8.4084.0
SELECT [t0].[id],[t0].[Date]
FROM [dbo].[temptbl] AS [t0]
WHERE [t0].[Date] = @p0
-- @p0: Input DateTime (Size = -1; Prec = 0; Scale = 0) [01/01/2001 00:00:00]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.8.4084.0
如果我理解正确,那就是:
- 带有[Date = 01/01/2001]的查询。
- 对先前查询中的每个结果的查询。
- 另一个查询,日期为[Date = 01/01/2001]。
这是可行的,但我担心性能。
其他答案建议在每个查询上重新创建上下文,但是我认为这种方法的性能也很差。
如何正确忽略已经获取的行,以及如何在具有联接/子对象的查询中做到这一点?
谢谢大家
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。