2014-05-03 4 views
0

Est-il possible de spécifier uniquement certains champs d'une table lors de l'utilisation de Linq et éventuellement d'inclure un nombre RecordSet?MVC Linq Query avec RecordSet Count

Voici ma requête existante dans les HomeController.cs

var contentModel = from m in db.Contents where (m.NavigationId == 1) && (m.Active == true) orderby m.Position select m; 
return View(contentModel); 

Je voudrais inclure Id, Titre, et résumé, définissez le nombre maximum d'enregistrements dans le jeu d'enregistrements à 12 et retourner une valeur supplémentaire qui est le nombre réel d'enregistrements/12 et passe à la vue.

Toute aide serait très apprécié :-)

+0

Que voulez-vous dire par une valeur ajoutée? Vous pouvez utiliser '.Take (12)' pour récupérer seulement 12 enregistrements –

+0

J'ai modifié ma requête en tant que var contentModel = (de m en db.Contents où (m.NavigationId == 1) && (m.Active == true) orderby m.Position sélectionnez m) .Take (12) qui fonctionne mais j'ai besoin de passer une autre valeur à la vue qui est le nombre réel d'enregistrements, disons 2 à diviser par le nombre maximum 12 alors devrait retourner 6. – iggyweb

+0

Aussi, je souhaite seulement sélectionner Id, Titre, Image et Résumé pas tous les champs. – iggyweb

Répondre

0

Au lieu de select m vous pouvez utiliser

select new { m.Name, m.Id, m.SomeOtherProperty } 

Ou si vous voulez passer ce résultat à une autre méthode comme une valeur de retour

select new ContentsViewModel() 
{ 
    Name = m.Name, 
    Id = m.Id, 
    SomeOtherProperty = m.SomeOtherProperty 
}; 

ContentViewModel est une deuxième classe POCO qui ressemble à:

public class ContentViewModel() 
{ 
     // Must have a public constructor with 0 parameters 
     public ContentViewModel(){} 

     public string Name{get;set;} 
     public int Id{get;set;} 
     public Something SomeOtherProperty{get;set;} 
} 

Cela ne peut pas être une classe Entity Framework en raison de limitations in Entity Framework described here.

Pour la question de comptage, voir: https://stackoverflow.com/a/7771298/736079

+0

Pour une raison quelconque, malgré Visual Studio 2013 ne pas avoir de problème avec var contentModel = (de m dans db.Contents où (m.NavigationId == 1) && (m.Active == true) orderby m.Position sélectionnez new {m. Id, m.Image, m.Title, m.Sub, m.Summary}). Prenez (12); il retourne maintenant un jeu d'enregistrements Null. – iggyweb

+0

La requête semble ok d'un coup d'œil ... Toujours difficile de voir visuellement ce qui ne va pas sans le contexte et les données.Btw, lorsque vous insérez du code source dans un commentaire, veuillez l'entourer de guillemets '', de cette façon ils sont mis en surbrillance: 'code'. – jessehouwing

+0

Je ne comprends pas non plus, si Visual Studio 2013 ne trouve pas de problème, je n'ai aucune chance de le découvrir. J'ai le même problème avec la table AspNetUsers, tout ce que je veux, c'est le nombre total d'enregistrements moins un utilisateur. Juste un nombre, pas de champs supplémentaires car ce n'est pas sql efficace, pas un fan de Linq, ramener T-SQL et Classic ASP LOL ;-) – iggyweb

0

Vous avez besoin quelque chose comme ceci:

Var contentModel = db.Contents.Where(m=>m.NavigationId==1) 
        .Where(m=m.Active=true).Take(12).Orderby(m=>m.Position).Select(m=> new {m.Id, m.Summary, m.Title,m.Image}); 

Mais je ne suis pas sûr de comprendre ce que vous entendez par nombre d'enregistrements par 12. Comme vous avez déjà défini le nombre d'enregistrements par 12.

Votre résultat sera une IEnumerable pour accéder au champ que vous devez parcourir.

En ce qui concerne le nombre que vous voulez passer, vous pouvez utiliser ViewBag objet: Dans votre countroller:

Int number = contentModel.ToList().Coun()/ 2; 
    ViewBag.myNum=number; 

À votre avis, vous utiliserez le ViewBag.myNum casté en int. C'est une option que vous pouvez également essayer.

Espérons que cela aidera.

+0

Merci, le code dont j'ai besoin était int nombre = 12/contentModel.ToList() .Compter(); et la valeur était 6 comme prévu et a passé à la contrôlée, cependant

rend réellement comme article class = "span @ ViewBag.rs"> et non article class = "span6"> – iggyweb

+0

Si j'utilise

il se traduit par l'article class = "span 6"> qui ne cible évidemment pas le span6 css. – iggyweb

+0

Essayez '@ HTML.Raw (ViewBag.rs)', espérons que cela aidera –

0
var contentModel = from m in db.Contents where (m.NavigationId == 1) && (m.Active == true) orderby m.Position 
select m.Id, m.Title,m.Image,m.Summary; 
var top = contentModel.Take(12); 
int max = top.Count(); 
int Count = contentModel.Count(); 
var avr = Count/max; 
return View(avr); 

ou return View(top); etc