如何填充`List <t>`linq </t> </t>中的`ICollection <t>`属性

时间:2014-01-03 15:29:02

标签: c# asp.net-mvc asp.net-mvc-3 linq lambda

我的班级

public partial class CTITLE_CHECKLIST : CError
{  
    public int Id { get; set; }

    [Required(ErrorMessage = "Requerido")]
    public int ID_Tipo_Checklist { get; set; }

    [Required(ErrorMessage = "Requerido")]
    public string Descripcion { get; set; }

    public virtual CTipo_CheckList Tipo_CheckList { get; set; }

    public ICollection<CSUBTITLE_CHECKLIST> Subtitulos { get; set; }
}

我的方法:

public List<CTITLE_CHECKLIST> GetCheked(string codigo, int tipoCheckList)
{
    try
    {

        var result = (from a in db.TITLE_CHECKLIST
                      from t in db.Tipo_CheckList
                      where a.ID_Tipo_Checklist == t.ID
                      where a.ID_Tipo_Checklist == tipoCheckList
                      select new CTITLE_CHECKLIST
                      {
                          Descripcion = a.Descripcion,
                          Id = a.Id,
                          ID_Tipo_Checklist = a.ID_Tipo_Checklist,
                          Tipo_CheckList = new CTipo_CheckList
                          {
                              Descripcion = t.Descripcion,
                              ID = t.ID,
                              ID_Depto = t.ID_Depto
                          },

                          Subtitulos = (from s in db.SUBTITLE_CHECKLIST
                                        where s.ID_Title == a.Id
                                        select new CSUBTITLE_CHECKLIST
                                        {
                                            AmountCK = s.AmountCK,
                                            Descripcion = s.Descripcion,
                                            ID = s.ID,
                                            ID_Title = s.ID_Title,
                                            Numeracion = s.Numeracion,
                                            checkList = (from ck in db.CheckList
                                                         where ck.ID_Subtitle == s.ID
                                                         && ck.Codigo == codigo
                                                         select new CCheckList
                                                         {
                                                             CK = ck.CK,
                                                             Amount = ck.Amount,
                                                             Codigo = ck.Codigo,
                                                             Codigo_TFile = ck.Codigo_TFile,
                                                             Comentario = ck.Comentario,
                                                             ID = ck.ID,
                                                             ID_Subtitle = ck.ID_Subtitle,
                                                             UserCre = ck.UserCre,
                                                             UserMod = ck.UserMod
                                                         }).FirstOrDefault()


                                        })//here I put ToList
                      }).ToList();

我的错误:

  

错误2无法将类型“System.Linq.IQueryable<TROP.Areas.TRAFICO.Controllers.LOGICA.CSUBTITLE_CHECKLIST>”隐式转换为“System.Collections.Generic.ICollection<TROP.Areas.TRAFICO.Controllers.LOGICA.CSUBTITLE_CHECKLIST>”。存在显式转换(您是否错过了演员?)C:\Users\jmitchell\Documents\Visual Studio 2012\Projects\TROP\TROP\Areas\TRAFICO\Controllers\LOGICA\CTITLE_CHECKLIST.cs 136 49 TROP

当我把.ToList,在哪里说在这里我把ToList它抛出一个错误说:

  

LINQ to Entities无法识别方法“System.Collections.Generic.List`1[TROP.Areas.TRAFICO.Controllers.LOGICA.CSUBTITLE_CHECKLIST] ToList[CSUBTITLE_CHECKLIST](System.Collections.Generic.IEnumerable`1[TROP.Areas.TRAFICO.Controllers.LOGICA.CSUBTITLE_CHECKLIST])”方法,并且此方法无法转换为商店表达式。

而且我知道如果我将属性字幕更改为IEnumerable<T>它将起作用,但是,我试图从MVC4帖子绑定此模型,并且我不与IEnumerable<T>绑定,它绑定使用ICollection<T>List<T>,我就像一天半的时间试图找出这个问题。

1 个答案:

答案 0 :(得分:1)

所以选择不是“在数据库中完成所有事情”或“在内存中完成所有事情”。你想做两件事。尽可能在数据库端执行所有操作,然后在完成所有操作后,在内存中完成剩余的操作。这种一般模式(主要是利用AsEnumerable)将允许您这样做:

(from a in db.TITLE_CHECKLIST
from t in db.Tipo_CheckList
where a.ID_Tipo_Checklist == t.ID
where a.ID_Tipo_Checklist == tipoCheckList
select new //note were using an anonymous type here, 
           //as the real type can't take a non-list
{
    Descripcion = a.Descripcion,
    Id = a.Id,
    ID_Tipo_Checklist = a.ID_Tipo_Checklist,
    Tipo_CheckList = new CTipo_CheckList
    {
        Descripcion = t.Descripcion,
        ID = t.ID,
        ID_Depto = t.ID_Depto
    },

    Subtitulos = from s in db.SUBTITLE_CHECKLIST
                where s.ID_Title == a.Id
                select new CSUBTITLE_CHECKLIST
                {
                    AmountCK = s.AmountCK,
                    Descripcion = s.Descripcion,
                    ID = s.ID,
                    ID_Title = s.ID_Title,
                    Numeracion = s.Numeracion,
                    checkList = (from ck in db.CheckList
                                where ck.ID_Subtitle == s.ID
                                && ck.Codigo == codigo
                                select new CCheckList
                                {
                                    CK = ck.CK,
                                    Amount = ck.Amount,
                                    Codigo = ck.Codigo,
                                    Codigo_TFile = ck.Codigo_TFile,
                                    Comentario = ck.Comentario,
                                    ID = ck.ID,
                                    ID_Subtitle = ck.ID_Subtitle,
                                    UserCre = ck.UserCre,
                                    UserMod = ck.UserMod
                                }).FirstOrDefault()
                }//note no ToList
})
//This will ensure that all operators that follow
//are done in memory, not on the DB end
.AsEnumerable()
.Select(checklist => new CTITLE_CHECKLIST
{
    Descripcion = checklist.Descripcion,
    Id = checklist.Id,
    ID_Tipo_Checklist = checklist.ID_Tipo_Checklist,
    Subtitulos = Subtitulos.ToList(),
});