Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is this linq expression not working?

I'm using LINQ to Entities.

I have a table called Student; it has ID and Name as it's columns. ID is a primary key.

I'd like to be able select the name of the Student and get the amount of Students with the same Name.

So for example I'd have this as my table data.

ID  Name  
1   Bob
2   Will
3   Bob

After performing the query I'd return a List of Student objects looking like this.

Name    Quantity
Bob     2
Will    1

I guess it is kind of similar to how the Tags page of stackoverflow works; It has the name and the quantity.

Anyways, I created a partial class called Student.cs in which I added a Quantity property like this.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MySite.Models
{
    public partial class Student
    {
        private int _quantity;

        public int Quantity
        {
            get { return _quantity; }
            set { _quantity = value; }
        }
    }
}

I came up with this but I'm getting an error..

    public IQueryable<Student> FindStudentsDistinctWithQuantity()
    {
        /*SELECT Name, COUNT(Name) AS Quantity
        FROM Student
        GROUP BY Name*/

        var students= (from s in db.Students
                    group s by s.Name into g
                    select new {Name = g.Key, Quantity = g.Count()});            

        return students;
    }

The error i'm getting says something like Can't convert from type Anonymous to the Student list. Does it have something to do with it not recognizing the quantity field I added in the partial class?

Thanks!

like image 763
hanesjw Avatar asked Jan 28 '10 19:01

hanesjw


People also ask

What is query expression in Linq?

C# Query Expression is an expression that is written by using LINQ query syntax. The LINQ (Language Integrated Query) is a language that is used to construct a query. C# Query Expression contains set of clauses and use query expression similar to SQL.

What is System LINQ expression?

Expression Class (System. Linq. Expressions) Provides the base class from which the classes that represent expression tree nodes are derived. It also contains static (Shared in Visual Basic) factory methods to create the various node types.

Is Linq deprecated?

This package has been deprecated as it is legacy and is no longer maintained.


2 Answers

Change your Student type to look like this:

public partial class Student
{
    public Int32 Quantity { get; set; }
    public String Name { get; set; }
}

And your query to look like this:

var students = from s in db.Students
               group s by s.Name into g
               select new Student { 
                   Name = g.Key, 
                   Quantity = g.Count() };

Your method returns an IQueryable<Student> but you are currently returning an IQueryable<T> of a projected anonymous type.

You need to refactor your Student type to have a Name property of type String and then project new instances of your Student type from the expression so that the return type of your expression will match the return type of your method.

like image 194
Andrew Hare Avatar answered Oct 13 '22 02:10

Andrew Hare


Your function returns Student

public IQueryable<Student> FindStudentsDistinctWithQuantity(){ ... }

But your Linq query returns a new type that contains a Name and an Int (count)

               >>> select new {Name = g.Key, Quantity = g.Count()});            

y-try select new Student{Name = g.Key, Quantity = g.Count()}

like image 38
Russell Steen Avatar answered Oct 13 '22 03:10

Russell Steen