问题描述
我发现了这个错误,这是CreateQuery和MergeOption错误同步的结果。 Bug表现如下:想象一下,我们在数据库中有一个名为SearchTest的表,有三个字段Id,F1和F2,我们有几条记录如下所示:
+ ---- + ---- + ---- +
| Id | F1 | F2 |
+ ---- + ---- + ---- +
| 1 | | |
| 2 | B | |
| 3 | C | |
| 4 | D | A |
+ -------------- +
+----+----+----+
| Id | F1 | F2 |
+----+----+----+
| 1 | A | A |
| 2 | B | A |
| 3 | C | A |
| 4 | D | A |
+--------------+
现在,请考虑以下代码:
DataServiceContext ctx =
new DataServiceContext ( new Uri (" http://.../SearchTestService.svc/" ));
DataServiceContext ctx =
new DataServiceContext(new Uri("http://.../SearchTestService.svc/"));
ctx.MergeOption = MergeOption .AppendOnly;
ctx.MergeOption = MergeOption.AppendOnly;
IQueryable < SearchTest > q =
ctx.CreateQuery< SearchTest >( " SearchTest" )
。< SearchTest >(st => st .Id == 1);
IQueryable<SearchTest> q =
ctx.CreateQuery<SearchTest>("SearchTest")
.Where<SearchTest>(st => st.Id == 1);
foreach ( SearchTest st in q)
foreach (SearchTest st in q)
{
st.F2 = " B" ;
st.F2 = "B";
ctx.UpdateObject(st);
}
IQueryable < SearchTest > q1 =
ctx.CreateQuery< SearchTest >( " SearchTest" )
。< SearchTest >(st => st .F2 == " A" );
IQueryable<SearchTest> q1 =
ctx.CreateQuery<SearchTest>("SearchTest")
.Where<SearchTest>(st => st.F2 == "A");
foreach ( SearchTest st in q1)
foreach (SearchTest st in q1)
{
控制台 。WriteLine(st.Id + " " + st.F1 + " " + st.F2);
Console.WriteLine(st.Id + " " + st.F1 + " " + st.F2);
}
它将产生:
1 A B
2 B A
3 C A
4 D A
1 A B
2 B A
3 C A
4 D A
明显的错误是我希望F2 =="A"的所有对象,但它返回给我的F2 =="B"记录?!?!
如果我理解正确,第一个问题是CreateQuery只是在数据库中执行搜索而不是在内存中的上下文中执行搜索。这是显而易见的,因为刚刚添加的新对象根本没有被考虑。第二个问题是,由于merge选项,满足数据库中某些条件的对象,当它应该在上下文中返回/加载时,由于merge option = append only,将被替换为可能不满足给定的新版本标准。
我认为问题的根源是决定CreateQuery应该只搜索数据库。我想你应该重新考虑一下。从我/程序员的角度来看,我将数据上下文看作某种CACHE,并且我看到操作context.CreateQuery作为该上下文的操作,应首先查看结果,然后在数据库中查找。如果程序员必须关心对象是否已经加载,Astoria将失去意义。
推荐答案
1)在内存对象中运行Linq查询的语义最多可能无法与后端数据源匹配。例如,考虑如何处理空值。这可能会导致Linq查询的轻微调整会产生不同的结果,因为某些表达式是在本地与远程评估的。
2)沿着同样的路线,表现会变得无法预测。本地查询速度快100倍,因此我们不希望开发人员对性能感到惊讶。
因为这种界限在阿斯托里亚非常明显。这意味着您可以在本地查询或将查询发送到服务器,但我们永远不会混合它们。
希望有所帮助。
这篇关于DataServiceContext.CreateQuery + MergeOption问题/错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!