【问题标题】:Ado Net Data Services BeginExecute ProblemAdo Net Data Services BeginExecute 问题
【发布时间】:2009-07-22 16:11:11
【问题描述】:
public void metodoX()
{ 
 foreach (TURNO t in listaTurnoPersona)
 {
  DataServiceQuery<VST_CANTIDAD_PERSONAS_POR_DIA> query = 
    General.Entities.VST_CANTIDAD_PERSONAS_POR_DIA.Where(
                    z => z.ID_TURN == t.ID_TURN 
                        && z.FE_CALE >= RadDatePicker1.SelectedDate.Value
                        && z.FE_CALE <= RadDatePicker1.SelectedDate.Value.AddDays(6)) 
    as DataServiceQuery<VST_CANTIDAD_PERSONAS_POR_DIA>;
  query.BeginExecute(ProcesarHorarioPersonasTurno, query);
  //HERE THE ID_TURN CHANGE 1, 2, 3 , 4 ...
 }
}

public void ProcesarHorarioPersonasTurno(IAsyncResult result)
{
            List<VST_CANTIDAD_PERSONAS_POR_DIA> listaDias = (result.AsyncState as   DataServiceQuery<VST_CANTIDAD_PERSONAS_POR_DIA>).EndExecute(result).ToList();
         //HERE ALWAYS I GET THE RESULT IDTURN = 1}

请检查上面的代码,为什么会这样,假设ID_TURN也发生了变化,以前没有发生过。

【问题讨论】:

    标签: linq-to-entities wcf-data-services astoria


    【解决方案1】:

    您在调用 Where() 时捕获了迭代器变量“t”,这是一个 lambda 表达式:

    Where( z => z.ID_TURN == t.ID_TURN && z.FE_CALE ...
    

    到查询执行时,它们都引用了相同的“t”,在您的情况下,它是循环终止之前的最终值。换句话说,它们都获得了相同的 t.ID_TURN 值,在您的示例中为“1”。

    要正确执行此操作,请声明一个新变量:

    var id = t.ID_TURN;
    
    DataServiceQuery query = General.Entities.VST_CANTIDAD_PERSONAS_POR_DIA
        .Where( z => z.ID_TURN == id && 
            z.FE_CALE >= RadDatePicker1.SelectedDate.Value && 
            z.FE_CALE <= RadDatePicker1.SelectedDate.Value.AddDays(6)) 
        as DataServiceQuery;
    

    这将为 Where 的每次调用捕获不同的变量,从而获得您想要的结果。

    【讨论】:

      【解决方案2】:

      有了这个,现在 result.AsyncState URL 正在改变 ID_TURN 值(之前我总是得到最后一个(128M))

      {http://localhost:888/Services/WebDataServiceSiata.svc/VST_CANTIDAD_PERSONAS_POR_DIA()?$filter=((**ID_TURN eq 21M**) and (FE_CALE ge datetime'2009-07-20T00:00:00-05:00')) and (FE_CALE le datetime'2009-07-26T00:00:00-05:00')}
      

      EndExecuteResult 仍在返回listaDia[0].ID_TURN = 1

      List listaDias = (result.AsyncState as DataServiceQuery).EndExecute(result).ToList()
      

      【讨论】:

      • 对不起,浏览器已关闭,因为我没有注册,所以无法编辑第一个问题。
      • 好的 .. 但是你的处理程序 (ProcesarHorarioPersonasTurno) 被调用了四次,是吗?您不会期望第一个处理程序调用包含所有结果,对吧? (不得不问——如果这很明显,对不起。)
      • 实际上是 128 次,在 128 次访问 ProcesarHorarioPersonasTurno 方法时,ID_TURN 是相同的,我可以看到 result.asyncstate 查询现在正在改变,但 endexecute 返回相同的结果。
      • 对不起,丹尼斯,我很茫然。如果我以后想到什么,我会添加一个新的评论。同时,考虑注册……它让事情变得更容易,更多的人更有可能回答你的问题。 :-)
      猜你喜欢
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多