在linq中将字符串拆分为字符串

时间:2012-02-14 20:31:14

标签: c# linq linq-to-sql linq-to-entities

我尝试用不同的方法来实现这一目标,但我可以使它工作我有一个名为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,我有一个名为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所以我做了两个这样的linqs *

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 个答案:

答案 0 :(得分:2)

如果您通过调用AsEnumerable() 运行select之前强制数据进入内存,我认为您的查询运行正常。

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 :(得分:1)

您要按','而不是';'进行拆分。


最后一个查询可以像这样简化

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(); 

答案 2 :(得分:1)

你是对的,LINQ to SQL无法做到的一些事情(example is here)。要解决这个问题,您只需要使用LINQ to Objects执行不在LINQ to SQL中的位,因此需要使用类似AsEnumerable

之类的内容将IQueryable转换为IEnumerable。