Я использую 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;
}
Ошибка, которую я получаю, говорит, что чему-то нравится, не Может преобразовать из типа, Анонимного для Студенческого списка. Это имеет некоторое отношение к нему не распознавание поля количества, которое я добавил в частичном классе?
Спасибо!
Измените ваш Студент
Тип , чтобы выглядеть так:
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
, а затем проектировать новые экземпляры вашего студента
Введите из выражения, так что возвратный тип вашего выражения будет соответствовать типу возврата вашего метода.
Обратное значение метода связей « Студенты
» IQueryable
, но ... LINQ Выражение создает IQUERYable <некоторые анонимный тип>
, и нет преобразования между двумя.
Вы можете получить детскую шаг дальше, изменив вашу часть:
select new Student() {....}
, надеюсь, это помогает
Tyler
Выбрать новые
, вызывают изменение формы данных, что означает, что запрос 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;
}
Проблема в том, что вы не возвращаете студентов - вы пытаетесь вернуть анонимный тип из вашей функции. Это не допускается.
Создайте класс, чтобы представлять свой результат и использовать 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; }
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()};
Если студент определяет свойства, используемые в инициализации.
Вы делаете проекцию в вашем запросе 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};
Ваша функция возвращает студент
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 ( )}