разделить поле строкой в ​​linq - PullRequest
0 голосов
/ 15 февраля 2012

Я пытался по-разному это сделать, но я могу заставить его работать. У меня есть класс с именем CampoConfiguracionVista, определенный следующим образом

public class CampoConfiguracionVista
{
    public CampoConfiguracionVista() 
    { 

    }

    public int IDCampo { get; set; }
    public int IDConfiguracion { get; set; }
    public string Nombre { get; set; }
    public bool ValidationEspecial { get; set; }
    public bool Requerido { get; set; }
    public int IDTipodato { get; set; }
    public int? minimo { get; set; }
    public int? maximo { get; set; }
    public string[] valores { get; set; }
}

И у меня есть linq, где у меня есть поле i с именем Valores, которое содержит строковое значение, разделенное на ; Итак, что я хочу сделать, это разделить это значение поля на строковый массив, который я пробовал двумя способами:

первый: все в одном linq

    var query = (from T in db.ConfiguracionCampo
             where T.IDTipificacion == idTipificacion
             && T.Campo.Activo == true
             select new CampoConfiguracionVista()
             {
                 IDCampo = T.Campo.IDCampo,
                 IDTipodato = T.IDTipodato,
                 ValidationEspecial = T.ValidationEspecial,
                 minimo = T.minimo,
                 maximo = T.minimo,
                 Requerido = T.Requerido,
                 Nombre = T.Campo.Nombre,
                 valores = T.Valores.Split(';')
             }).ToList();

Во-вторых: я думаю, что проблема заключалась в том, что linq не может перевести разбиение в sql, поэтому я создал два linq, подобных этому *

var query = (from T in db.ConfiguracionCampo
                         where T.IDTipificacion == idTipificacion
                         && T.Campo.Activo == true
                         select T);

var camposConfigurados = (from D in query select D).Select(C => new CampoConfiguracionVista()
            {
                IDCampo = C.Campo.IDCampo,
                IDTipodato = C.IDTipodato,
                ValidationEspecial = C.ValidationEspecial,
                minimo = C.minimo,
                maximo = C.minimo,
                Requerido = C.Requerido,
                Nombre = C.Campo.Nombre,
                valores = C.Valores.Split(';')
            }).ToList();

Что я делаю не так ??

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Если вы форсируете данные в память до выполнения выбора с помощью вызова AsEnumerable(), я думаю, ваш запрос должен работать нормально.

var camposConfigurados = (from D in query select D)
    .AsEnumerable()
    .Select(C => new CampoConfiguracionVista()
        {
            IDCampo = C.Campo.IDCampo,
            IDTipodato = C.IDTipodato,
            ValidationEspecial = C.ValidationEspecial,
            minimo = C.minimo,
            maximo = C.minimo,
            Requerido = C.Requerido,
            Nombre = C.Campo.Nombre,
            valores = C.Valores.Split(',')
        }).ToList();
1 голос
/ 15 февраля 2012

Вы правы, некоторые вещи, которые вы не можете сделать с помощью LINQ to SQL (пример здесь ).Чтобы обойти проблему, вам просто нужно сделать биты, которых нет в LINQ to SQL, с LINQ to Objects, поэтому вам нужно преобразовать IQueryable в IEnumerable, используя что-то вроде AsEnumerable

1 голос
/ 15 февраля 2012

Вы делите на ',' вместо ';'.


Последний запрос можно упростить следующим образом:

var camposConfigurados = query
    .AsEnumerable() // <== this makes succeeding queries run with LINQ-to-Objects.
    .Select(C => new CampoConfiguracionVista() { 
        IDCampo = C.Campo.IDCampo, 
        IDTipodato = C.IDTipodato, 
        ValidationEspecial = C.ValidationEspecial, 
        minimo = C.minimo, 
        maximo = C.minimo, 
        Requerido = C.Requerido, 
        Nombre = C.Campo.Nombre, 
        valores = C.Valores.Split(';') 
    }).ToList(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...