Winforms LINQ到SQL和缓存

Winforms LINQ到SQL和缓存,winforms,linq-to-sql,Winforms,Linq To Sql,我在LINQtoSQL和缓存方面遇到了麻烦。 我已经在这方面发现了类似的问题,但它们似乎都没有处理在应用程序之外修改db的情况 假设我有一个Windows窗体应用程序,其中用户可以每天浏览一些只读数据。 这是我的代码的一个非常简化的版本: public partial class Form1 : Form { DateTime curDate = new DateTime(2001, 1, 1); DataClasses1DataContext dc = new DataCla

我在LINQtoSQL和缓存方面遇到了麻烦。 我已经在这方面发现了类似的问题,但它们似乎都没有处理在应用程序之外修改db的情况

假设我有一个Windows窗体应用程序,其中用户可以每天浏览一些只读数据。 这是我的代码的一个非常简化的版本:

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);
        }
    }

}
这是BL的初始值:

| Id    | Value | Date
+-------+-------+------------
| 11105 | 1     | 01/01/2001
| 11106 | 2     | 01/01/2001
| 11107 | 3     | 02/01/2001
第一次运行时,输出cosole显示:

 [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]

现在我提前一天,然后手动添加(使用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);
或者这样:

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日,不同日期的输出类似):

如果我理解正确,有:

  • 具有[Date=01/01/2001]的查询
  • 前一查询中每个结果的查询
  • 另一个查询为[Date=01/01/2001]
虽然这样做有效,但我担心性能

其他答案建议在每个查询上重新创建上下文,但我认为这种方法的性能也很差

如何正确地忽略已获取的行,以及如何在具有联接/子对象的查询中这样做

谢谢大家

根据DataContext,它是轻量级的,创建起来并不昂贵。