【问题标题】:c# grpc repeated list from db时间:2019-01-10 标签:c#grpcrepeatedlist from db
【发布时间】:2019-08-29 14:36:14
【问题描述】:

我想得到一个带有列表的对象。为此的人员和数据库结果。

为了描述问题,我分享了 proto 文件,然后是代码 c# 在复制和粘贴 Visual Studio 时标记错误的地方。

一个profo文件是:

syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.example.migrpc.javierpersonas";
option java_outer_classname = "JavierPersonas";
option objc_class_prefix = "HLW";
package javierpersonas;

service ServicioProbarPersonas {
  rpc ListaPersonas(PersonaCompleto) returns (stream PersonaCompletoCollection) {}
}

message PersonaCompleto {
  int32 idpersona = 1;
  string nombre = 2;  
  string apellido = 3;
  int32 edad = 4;
  bool active = 5;
  string status =6;
}

message PersonaCompletoCollection {
    repeated PersonaCompleto personasCompleto = 1;
    bool title = 2;
    string titlename =3;
} 

文件c#是

public override async Task<PersonaCompletoCollection>  L    istaPersonas(PersonaCompleto request, IServerStreamWriter<PersonaCompletoCollection> responseStream, ServerCallContext context)
    {           
        List<PersonaCompleto> listaPersonas = new List<PersonaCompleto>();
        var itemsDb = await _context.Persona.ToListAsync();
        foreach (var item in itemsDb)
        {
            var people = new PersonaCompleto();
            people.Idpersona = item.idpersona;
            people.Apellido = item.apellido;
            people.Nombre = item.nombre;
            people.Edad = item.edad;              

            listaPersonas.Add(people);
        }

        PersonaCompletoCollection res = new PersonaCompletoCollection();
        res.Title = true;
        res.Titlename = "doctor";
        res.PersonasCompleto = listaPersonas;
        await responseStream.WriteAsync(res);
        return await Task.FromResult(res);
    }

Res.Personacompleto 是只读的。 你有什么建议吗?可以分享代码吗?

【问题讨论】:

    标签: c# grpc


    【解决方案1】:

    我有同样的问题,我找到的唯一解决方案是使用 protobuf-net 将数据保存到文件,然后发送到服务器。

    编辑: 好的,我有另一个解决方案给你。你需要做的就是

    var message = new PersonaCompletoCollection { 
        PersonasCompleto = {listaPersonas},
        Title = true,
        TitleName = "doctor"
    };
    

    然后

    var reply = client.WriteAsync(message);
    

    编辑2 另一个解决方案,我认为最好的: Automapper IEnumerable within class is not being mapped to RepeatedField

    让我知道这是否有效。

    【讨论】:

      【解决方案2】:

      不能直接设置重复字段,因为它没有集合。

      你可以使用 linq 来提高代码的可读性,你可以使用 addRange 来添加你的集合:

      public override async Task<PersonaCompletoCollection>  ListaPersonas(PersonaCompleto request, IServerStreamWriter<PersonaCompletoCollection> responseStream, ServerCallContext context)
      {
          var itemsDb = await _context.Persona.ToListAsync();
          var itemsTransformed = itemsDb
              .Select(itemDb => new PersonaCompleto
              {
                  Idpersona = item.idpersona,
                  Apellido = item.apellido,
                  Nombre = item.nombre,
                  Edad = item.edad
              })
              .ToList();
      
          PersonaCompletoCollection res = new PersonaCompletoCollection
          {
              Title = true,
              Titlename = "doctor"
          };
          res.PersonasCompleto.AddRange(itemsTransformed);
          await responseStream.WriteAsync(res);
          return await Task.FromResult(res);
      }
      

      【讨论】:

        猜你喜欢
        • 2012-09-18
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多