BerdaN
BerdaN

Reputation: 49

Asp.Net Mvc Linq issue

I know my problem is really basic. If I write /api/category/1, I wanna list all Tales with the categoryId==1. I wrote this code, but it gives an error.

[HttpGet]
public IEnumerable<Tale> GetAllTalesByCategory(int id)
{
    var tales = TaleService.FindAllTale().Select(x => new Tale
    {
        TaleId = x.TaleId,
        TaleName = x.TaleName,
        Content = x.Content,
        VoicePath = x.VoicePath
    }).Where(x => new Tale
    {
        x.Categories.Select(c => c.CategoryId).First() == id                    
    });
}

Error:

Error   1   Cannot initialize type 'MasalYuvasi.Entities.Tale' with a collection initializer because it does not implement 'System.Collections.IEnumerable' D:\MvcProject\MasalYuvasi\MasalYuvasi\Controllers\DenemeController.cs   33  13  MasalYuvasi

Models:

public class Tale
{
    public int TaleId { get; set; }
    public string TaleName { get; set; }
    public string Content { get; set; }
    public string VoicePath { get; set; }
    public virtual ICollection<Category> Categories { get; set; }
    public Tale()
    {
        this.Categories = new List<Category>();
    }   
}

public class Category
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public virtual ICollection<Tale> Tales { get; set; }
    public Category()
    {
        this.Tales = new List<Tale>();
    }
}

Upvotes: 0

Views: 81

Answers (2)

JDB
JDB

Reputation: 25875

The problem is that your code is using a collection initializer here:

new Tale
{
    x.Categories.Select(c => c.CategoryId).First() == id                    
}

I'm not sure what this code is supposed to be doing, but as x.Categories.Select(c => c.CategoryId).First() == id will return a bool, I don't think this is doing what you want it to.


Based on your comment:

I want to list in the category of tales. Forexample I have 2 tales in CategoryId is 1. If I write "/api/category/1" ı want to list this 2 tales.

I think you are looking for something simpler than what you've got. You want to select Tales (represented by x) where Any of the categories have a CategoryId of id:

.Where(x => x.Categories.Any(c => c.CategoryId == id ));

Note that you can append .ToList() to the end of the where clause, as suggested by pjobs, but this may have a subtle effect on the behavior of your application. For more detail, see LINQ and Deferred Execution.

Upvotes: 1

pjobs
pjobs

Reputation: 1247

Try this:

[HttpGet]
public IEnumerable<Tale> GetAllTalesByCategory(int id)
{
    var tales = TaleService.FindAllTale().Select(x => new Tale
    {
        TaleId = x.TaleId,
        TaleName = x.TaleName,
        Content = x.Content,
        VoicePath = x.VoicePath
    }).Where(x => x.Categories.Select(c => c.CategoryId).First() == id).ToList();
}

Fixed the where condition, and added .ToList().

Upvotes: 2

Related Questions