DataServiceContext.CreateQuery + MergeOption问题/错误 [英] DataServiceContext.CreateQuery + MergeOption Issue/Bug

查看:110
本文介绍了DataServiceContext.CreateQuery + MergeOption问题/错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现了这个错误,这是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问题/错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆