簡體   English   中英

Linq使用連接和分組

[英]Linq using join and grouping

我正在嘗試做一些非常簡單的事情。 我的數據庫中有兩個表,我想使用linq查詢。 書本表和GenreTypes表。 該查詢的結果將轉到我的Web Api。

這是一個代碼片段:

public List<BooksChart> GetBooksChart()
{
    var results = from b in _dbcontext.Books
                  join g in _dbcontext.GenreTypes
                  on b.GenreTypeId equals g.Id
                  group g by g.Name into n
                  select (z => new BooksChart
                  {
                      category_name = n.Key,
                      value = n.Count()
                  }).ToList();

    return results;
}

public class BooksChart
{
    public string category_name;
    public int value;
}

我想將分組“ n”的結果存儲在BooksChart類中以構造Api。

此代碼未編譯。

以前,我只查詢Books的一個表,該表分為Books和GenreTypes。

我之前用於查詢圖書的工作代碼是:

var results = _dbcontext
    .Books
    .GroupBy(x => x.GenreType)
    .Select(z => new BooksPieChart
    {
        category_name = z.Key,
        value = z.Count()
        }).ToList();

        return results;

編輯

我要在SQL中實現的目標如下:

select count(*), g.Name
from books b, GenreTypes g
where b.GenreTypeId = g.Id
group by g.Name;

您正在混合查詢和方法的兩個語法選項。 對於查詢語法,您需要像這樣進行投影( select ):

return (from b in _dbcontext.Books
        join g in _dbcontext.GenreTypes on b.GenreTypeId equals g.Id
        group g by g.Name into n
        select new BooksChart {
            category_name = n.Key,
            value = n.Count()
        }).ToList();

(z =>....)的格式是傳遞給Select方法的labmda的聲明。

網站說明:

  • 正如@Rabbi所評論的那樣,由於您使用的是EF,請考慮適當定義導航屬性 這將使查詢更加簡單。
  • sql的旁注-考慮在from使用joins而不是多個表: INNER JOIN ON vs WHERE子句

括號必須包圍整個查詢,如下所示:

var results = (from b in _dbcontext.Books
               join g in _dbcontext.GenreTypes
               on b.GenreTypeId equals g.Id
               group g by g.Name into n
               select new BooksChart
               {
                   category_name = n.Key,
                   value = n.Count()
               }).ToList();

編譯錯誤是由於此原因(z =>根本不需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM