Почему это linq выражение не работает?

Я использую LINQ для Объектов.

У меня есть таблица под названием Студент; это имеет идентификатор и Имя, поскольку это - столбцы. Идентификатор является первичным ключом.

Я хотел бы смочь выбор имя Студента и получить количество Студентов с тем же Именем.

Так же, например, у меня было бы это как мои данные таблицы.

ID  Name  
1   Bob
2   Will
3   Bob

После выполнения запроса я возвратил бы Список Студенческих объектов, бывших похожих на это.

Name    Quantity
Bob     2
Will    1

Я предполагаю, что это довольно подобно тому, как страница Tags stackoverflow работает; Это имеет имя и количество.

Так или иначе я создал частичный класс по имени Student.cs, в котором я добавил свойство Quantity как это.

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; }
        }
    }
}

Я придумал это, но я получаю ошибку..

    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;
    }

Ошибка, которую я получаю, говорит, что чему-то нравится, не Может преобразовать из типа, Анонимного для Студенческого списка. Это имеет некоторое отношение к нему не распознавание поля количества, которое я добавил в частичном классе?

Спасибо!

5
задан hanesjw 28 January 2010 в 19:51
поделиться

7 ответов

Измените ваш Студент Тип , чтобы выглядеть так:

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

и ваш запрос, чтобы выглядеть так:

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

Ваш метод возвращает IQUERYable <студент> , но вы в настоящее время Возвращая iQueryable прогнозируемого анонимного типа.

Вам нужно решить ваш Студент Тип , чтобы иметь имя Имя Свойство String , а затем проектировать новые экземпляры вашего студента Введите из выражения, так что возвратный тип вашего выражения будет соответствовать типу возврата вашего метода.

4
ответ дан 18 December 2019 в 13:14
поделиться

Обратное значение метода связей « Студенты » IQueryable , но ... LINQ Выражение создает IQUERYable <некоторые анонимный тип> , и нет преобразования между двумя.

Вы можете получить детскую шаг дальше, изменив вашу часть:

select new Student() {....}

, надеюсь, это помогает

Tyler

2
ответ дан 18 December 2019 в 13:14
поделиться

Выбрать новые ключевые слова ключевых слов , вызывают изменение формы данных, что означает, что запрос LINQ не будет возвращать IQueryable , а скорее анонимный тип, содержащий «имя» и «количество» " характеристики. Если вы измените его, чтобы вернуть конкретный тип, а не анонимный, который вы сможете получить данные в нужной форме.

public class StudentGrouping {
    public string Name { get; set; }
    public int Quantity { get; set; }
}

public IQueryable<StudentGrouping> 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 StudentGrouping {
                   Name = g.Key, 
                   Quantity = g.Count()
                }).AsQueryable();            

    return students;
}
2
ответ дан 18 December 2019 в 13:14
поделиться

Проблема в том, что вы не возвращаете студентов - вы пытаетесь вернуть анонимный тип из вашей функции. Это не допускается.

Создайте класс, чтобы представлять свой результат и использовать New MyClass {...} вместо new {...} в вашем запросе, и изменить способ возврата iQueryable вместо iQueryable <студент> .

Вы могли бы, например, сделать класс под названием Студенческие исследования .

class StudentNameAndResults
{
    public string Name { get; set; }
    public int Quantity { get; set; }
}

В качестве альтернативы вы можете просто вернуть результат в качестве словаря или IENUMABLable из IPRUPING. Например:

public IDictionary<string, int> FindStudentsDistinctWithQuantity()
{
    Database db = new Database();
    var students= (from s in db.Students
                group s by s.Name into g
                select new {Name = g.Key, Quantity = g.Count()});

    return students.ToDictionary(s => s.Name, s => s.Quantity);
}

Кроме того, созданный вами свойство, использует Verbose Syntax от Pre-C # 3,0 дней. Теперь вы можете использовать Авто реализованные свойства Если вам не нужна специальная логика:

public int Quantity { get; set; }
2
ответ дан 18 December 2019 в 13:14
поделиться
 var students= (from s in db.Students
                    group s by s.Name into g
                    select new {Name = g.Key, Quantity = g.Count()}); 

Это анонимный тип, а не IQueryable . Либо вам нужно вернуть System.Object , или вам нужно вернуть iQueryable <1134018] IQUERIBALABLE <1134018] следующим образом ...

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

Если студент определяет свойства, используемые в инициализации.

1
ответ дан 18 December 2019 в 13:14
поделиться

Вы делаете проекцию в вашем запросе LINQ. Если вы будете зависать курсор в течение , в VA VAR учащихся , вы увидите его коллекцию анонимного типа.

Если вы хотите вернуть iQueryabley , вам нужно сделать:

 var students= from s in db.Students
                    group s by s.Name into g
                    select s.Key; 

Нет никаких способов внешних методов может знать о анонимном типе, который вы создали в вашем предыдущем примере, так что вы выиграли Не смогу вернуть типизированную коллекцию.

С помощью метода, который я предложил, вы все равно сможете выполнить проекцию на возвращаемой стоимость вашего метода позже, так как IQUERYBALABLE является композитивным до первого перечисления:

var students = FindStudentsDistinctWithQuantity();
var namesAndQunatity = from s in students select new {s.Name, s.Quantity};
1
ответ дан 18 December 2019 в 13:14
поделиться

Ваша функция возвращает студент

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

, но ваш запрос LINQ возвращает новый тип, который содержит имя и int (счетчик)

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

Y-TRY Выбрать новый студент {name = g.key, количество = g.count = g.key, количество = g.count ( )}

2
ответ дан 18 December 2019 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: