C#集合查詢Linq在項目中使用詳解

要說哪門後端語言的語法優雅,那就不得不提C#,而在我看來,LINQ語法可以說是其優雅的重要一環!

通常後端從數據庫查詢出來的數據並不是直接返回給前端使用的(不然前端….),而是需要進行二次的加工篩選處理等操作!而這個操作就離不開LINQ,不然for循環套for循環,先不說可不可行,肯定可行,但是代碼的可讀性完全丟失,其他同行看到也會笑話人,連編譯器運行這段代碼時也是發盡牢騷(….),從而導致程序的性能低下!
當然如果用SQL一次性把數據處理到位也行,但是實際項目開發中,很少能一次處理到位的,往往都需要二次處理(比如:我不僅需要List,還需要統計信息,總數、均值,總和等)

Linq Lambda

說到Linq,就不得不提Lambda表達式瞭,說實話,實際開發中,直接用Linq寫的相關代碼還真不多,Lambda表達式到處都是!

先上代碼,直觀看看他們兩者有什麼區別

static void Main(string[] args)
{
    List<User> users = new List<User>();
    var letters = "abcdefghijklmnopqrstuvwxyz";
    var rand = new Random();
    for (int i = 0; i < 10; i++)
    {
        string name = default;
        for(int j = 0; j < 4; j++)
        {
            name += letters[rand.Next(25)];
        }
        users.Add(new User { Name = name, Age = rand.Next(1, 99) });
    }

    //Linq
    IEnumerable<User> usera = from u in users where u.Age < 35 select u;
    //usera.ToList();

    //Lambda
    List<User> userb = users.Where(x => x.Age < 35).ToList();

    //輸出來看看
    foreach(User u in usera)
    {
        Console.WriteLine("name:{0},age:{1} \n", u.Name, u.Age);
    }
    Console.WriteLine("------------------");
    foreach (User u in userb)
    {
        Console.WriteLine("name:{0},age:{1} \n", u.Name, u.Age);
    }

    Console.ReadLine();
}

class User
{
    public string Name { get; set; }

    public int Age { get; set; }
}

看完代碼,是不是感覺Linq跟SQL差不多,對,本來他們就是類似語言,我個人猜測應該是模仿出來的一種語法糖吧(具體誰模仿誰就不得而知瞭),相似也好,學起來更方便瞭。而Lambda表達式寫起來是真的舒服!
那麼,Linq和Lambda有什麼關系呢
包含的關系,Linq范圍更廣一些,Lambda表達式看起來像一個箭頭函數,就是!,也可以說是一個匿名函數!他相當於Linq的二次封裝語法糖吧(個人理解)
基本上Linq能實現的,Lambda表達式都可以實現
通常溝通中,說Linq寫法,其實默認就是Linq Lambda表達式瞭。直接鏈式寫法,簡潔,可讀性,後期維護起來也是非常方便的。

眾所周知,SQL能實現的功能是非常強大的,而Linq同樣可以實現。
但實際開發中,SQL一般會寫的相當復雜,聚合查詢是常事,而Linq一般很少涉及(也能多表查詢),更多的是諸如去重、篩選、排序、分組、統計計算等操作

Linq項目中的一次使用經歷

獲取不同用戶的權限菜單 當用戶登錄時,可以獲取到用戶的權限菜單集合(id集合),而具體展示菜單,還需要到全部菜單集合中去查找對應的,然後篩選出來,返回給前端,最後進行渲染展示!
如果菜單集合List全都是一級菜單,那相當簡單,但是如果有二級、三級菜單就比較麻煩瞭,在這個篩選過程中,我就用到瞭Linq來實現部分功能

//powers 用戶權限菜單集合
//menus 全部菜單集合
//menus.SubItems 二級菜單集合

(from sub in menus.SubItems where powers.Any(x=>x.Key == sub.Id) select sub).Count()

如上代碼段,可以獲取到當前菜單的子菜單的個數
如果不加外層的Count(),那結果就是當前菜單子菜單(此用戶有權限的)集合
如果不采用Linq,一行代碼很難實現(方法還是有的,隻是不會Linq那麼方便寫)

Linq to js [在前端的應用]

LINQ其實並不是後端語言的專屬,前端同樣可以使用,隻需要引用相應的js插件即可
js、vue等項目中都有對應的插件(例如jslinq),僅需要對應的組件中引入插件(也可以在母版頁或全局引用),然後就可以像後端語言中一樣的使用即可。
具體寫法與後端語言差不多,常用方法名也都一樣
要說不一樣的地方,我感覺唯一不好的體驗就是,前端使用時,沒有代碼提示瞭,如果對LINQ不太熟悉的,在使用LINQ時,還需要借助相關文檔,多用幾次,自然就不算什麼問題瞭。

這裡就不展開細說Linq在前端的具體用法瞭,需要的可以自行查詢,這裡僅做一個拋磚引玉的效果。

到此這篇關於C#集合查詢Linq在項目中使用詳解的文章就介紹到這瞭,更多相關C#集合查詢Linq內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: