LINQ Group за месяц - PullRequest
       4

LINQ Group за месяц

0 голосов
/ 21 октября 2010

У меня проблемы с получением списка IQueryable (дозвукового) объекта, сгруппированного по месяцам и годам.

Базовый вид объекта ...

public partial class DatabaseObject
{
    [SubSonicPrimaryKey]
    public int objectID { get; set; }

    public string Description { get; set; }

    public decimal Value { get; set; }

    public string Category { get; set; }

    public DateTime DateOccurred { get; set; }
}

Способ получить IQueryable в моем хранилище базы данных ...

public IQueryable GetData(string DataType)
{
   return (from t in db.All<DatabaseObject>()
           orderby t.DateOccurred descending
           select t)
          .Where(e => e.Category == DataType);  
}

Мой вопрос: как мне вернуть даты, сгруппированные по месяцам? Я пробовал ниже, но это приводит к предупреждениям компилятора относительно анонимных типов ...

public IQueryable GetData(string DataType)
{
   var datalist = (from t in db.All<FinancialTransaction>().Where(e => e.Category == DataType);
                   let m = new
                   {
                       month = t.DateOccurred.Month,
                       year = t.DateOccurred.Year
                   }
                   group t by m into l select new
                   {
                       Description = string.Format("{0}/{1}", l.Key.month, l.Key.year),
                       Value = l.Sum(v => v.Value), // Sum(v => v.Value),
                       Category = "Grouped"
                       DateOccurred = l.Last(v => v.DateOccurred)
                   }
    return datalist;
}

Есть идеи?

Ответы [ 3 ]

1 голос
/ 21 октября 2010

Ни в коем случае не комбинируйте LINQ в синтаксисе запроса и LINQ в синтаксисе методов расширения.Используйте следующее:

from t in db.All<DatabaseObject>()    
where e.Category equals DataType
orderby t.DateOccurred descending
select t;
1 голос
/ 21 октября 2010

Попробуйте эту пару проблем, которые я обнаружил, но вам нужно выбрать объект базы данных вместо анонимного?

IQueryable<DatabaseObject> datalist = (
from t in db.All<FinancialTransaction>().Where(e => e.Category == DataType)
let m = new
{
    month = t.DateOccurred.Month,
    year = t.DateOccurred.Year
}
group t by m into l 
select new DatabaseObject()
{
    Description = string.Format("{0}/{1}", l.Key.month, l.Key.year),
    Value = l.Sum(v => v.Value),   //Sum(v => v.Value),
    Category = "Grouped", 
    DateOccurred = l.Max(v => v.DateOccurred)
}).AsQueryable();

Дайте мне знать, если мое решение сейчас то, что вы хотите. Я также заметил, что вы использовали Last? Используемого вами расширения у меня нет, поэтому я заменил его на Max. У меня не установлен дозвуковой процессор, поэтому он может поставляться с библиотеками.

0 голосов
/ 22 октября 2010

Проблема, очевидно, связана с тем, как Subsonic интерпретирует определенные операторы linq, и является известной ошибкой .

IEnumerable<DatabaseObject> datalist = (
from t in db.All<FinancialTransaction>().Where(e => e.Category == DataType).ToList()
let m = new
{
    month = t.DateOccurred.Month,
    year = t.DateOccurred.Year
}
group t by m into l 
select new DatabaseObject()
{
    Description = string.Format("{0}/{1}", l.Key.month, l.Key.year),
    Value = l.Sum(v => v.Value),   //Sum(v => v.Value),
    Category = "Grouped", 
    DateOccurred = l.Max(v => v.DateOccurred)
}).AsQueryable();

Я исправил это, объявив список типа IEnumerable ииспользуя ToList () для приведения взаимодействия с базой данных, наконец, запрос затем переделывается в AsQueryable ()

...