簡體   English   中英

在linq中將字段拆分為字符串

[英]split field a string in a linq

我以不同的方式嘗試完成此任務,但我可以使其正常運行,我有一個名為CampoConfiguracionVista的類, 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字段,其中包含一個字符串值,該字符串值之間用;分開; 因此,我要完成的工作是將該字段值拆分為我通過以下兩種方式嘗試過的字符串數組:

第一:多合一

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

我究竟做錯了什么??

如果您通過調用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();

您是用','而不是';'進行拆分


這樣可以簡化最后一個查詢

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

沒錯,LINQ to SQL不能做的某些事情( 這里是一個示例 )。 為了解決這個問題,您只需要使用LINQ to Objects來處理LINQ to SQL中沒有的位,所以您需要使用AsEnumerable之類的方法將IQueryable轉換為IEnumerable。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM