web-dev-qa-db-fra.com

Retourne la liste en utilisant select new in LINQ

C'est ma méthode qui me donne une erreur.

public List<Project> GetProjectForCombo()
{
    using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
    {
        var query = from pro in db.Projects
                    select new { pro.ProjectName, pro.ProjectId };

        return query.ToList();
    }
}

Si je le change avec ceci:

public List<Project> GetProjectForCombo()
{
    using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
    {
        var query = from pro in db.Projects
                    select pro;

        return query.ToList();
    }
}

Ensuite, cela fonctionne très bien sans erreur.

Pouvez-vous s'il vous plaît laissez-moi savoir que comment puis-je retourner uniquement ProjectId et ProjectName.

Merci.

47
Sami

La méthode ne peut pas retourner de type anonyme. Il doit être identique au type défini dans le type de retour de méthode. Vérifiez la signature de GetProjectForCombo et voyez quel type de retour vous avez spécifié.

Créez une classe ProjectInfo avec les propriétés requises puis, dans une nouvelle expression, créez un objet de type ProjectInfo.

class ProjectInfo
{
   public string Name {get; set; }
   public long Id {get; set; }
}

public List<ProjectInfo> GetProjectForCombo()
{
    using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
    {
        var query = from pro in db.Projects
                    select new ProjectInfo(){ Name = pro.ProjectName, Id = pro.ProjectId };

        return query.ToList();
    }
}
95
public List<Object> GetProjectForCombo()
{
   using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
   {
     var query = db.Project
     .Select<IEnumerable<something>,ProjectInfo>(p=>
                 return new ProjectInfo{Name=p.ProjectName, Id=p.ProjectId);       

     return query.ToList<Object>();
   }

}

7
John Peters

Vous ne pouvez pas renvoyer de types anonymes d'une classe ... (Bien, vous pouvez, mais vous devez d'abord les convertir en objet, puis utiliser la réflexion de l'autre côté pour extraire les données). les données à contenir.

class ProjectNameAndId
{
    public string Name { get; set; }
    public string Id { get; set; }
}

Ensuite, dans votre déclaration LINQ:

select new ProjectNameAndId { Name = pro.ProjectName, Id = pro.ProjectId };
5
Colin Mackay
public List<Object> GetProjectForCombo()
{
    using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
     {
         var query = from pro in db.Projects
                     select new {pro.ProjectName,pro.ProjectId};

         return query.ToList<Object>();
    }
}
3
user2383325

Ce qui est renvoyé est un type anonyme. Créez donc une nouvelle classe avec 2 champs.

class BasicProjectInfo {
   string name;
   string id;
}

et retournez new BasicProjectInfo(pro.ProjectName, pro.ProjectId);. Votre méthode dans ce cas renverra un List<BasicProjectInfo>

1
sh_kamalh

La valeur de retour de votre méthode doit être un List<Project>.

En utilisant select new, vous créez une instance de type anonyme au lieu d'une Project.

1
Groo

essayez cette solution pour moi son travail

     public List<ProjectInfo> GetProjectForCombo()
      {
    using (MyDataContext db = new MyDataContext 
    (DBHelper.GetConnectionString()))
         {
        return  (from pro in db.Projects
                    select new { query  }.query).ToList();
        }
      }
0
Martin Chinome

Vous pouvez le faire comme suit:

class ProjectInfo
{
    public string Name {get; set; }
    public long Id {get; set; }

    ProjectInfo(string n, long id)
    {
        name = n;   Id = id;
    }
}

public List<ProjectInfo> GetProjectForCombo()
{
    using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
    {
         var query = from pro in db.Projects
                    select new ProjectInfo(pro.ProjectName,pro.ProjectId);

         return query.ToList<ProjectInfo>();
    }
}
0
Husam Hilal