【Linq】 左连接、右连接、内链接

发布时间 2023-04-01 13:57:52作者: 小林野夫

左外部联接

可以看到和直接内连接的join差距在多了into,把可能为空的那个集合(表)放到一个集合,然后再对接进行DefaultIfEmpty(),再从这个结果中去取

 

 


 stocksinfo表格

 

 

 

packetassociationstocks 表格

实现 stocksinfo表格 和packetassociationstocks 表格 的左外连接,并且选择 Join后的前10条记录

    /// <summary>
        ///  为指定的板块添加股票
        /// </summary>
        /// <param name="blockID">板块id</param>
        /// <param name="keyword">查找关键词</param>
        /// <returns></returns>
        public async Task<ObservableCollection<StockPOCO>?> GetStocksForPacketAsync(int blockID,string keyword)
        {
            ObservableCollection<StockPOCO>? coll = new();
            //选取股票名称或者名字 保护指定关键词的 选取前十条记录
            var content = (from A in dataContext.Stocksinfos
                           join B in dataContext.Packetassociationstocks on A.Stockid equals B.Stockid into prodGroupList
                           from C in prodGroupList.DefaultIfEmpty()//DefaultIfEmpty()实现左外连接
                           where A.Stockid.Contains(keyword) || A.Name.Contains(keyword)// 筛选 表格A,切记不是筛选prodGroupList
                           select new StockPOCO{ StockID= A.Stockid,  Name= A.Name, HadAdded= C.Isselected==1 }
                          ).Take(10).ToList();
            return new ObservableCollection<StockPOCO>(content);
        }

解说:

第一步是使用分组联接执行内联。

在关系数据库术语中,内部联接会生成一个结果集,在该结果集中,第一个集合的每个元素对于第二个集合中的每个匹配元素都会出现一次。 如果第一个集合中的元素没有匹配元素,则它不会出现在结果集中。

第二步是在结果集内包含第一个(左)集合的每个元素,即使该元素在右集合中没有匹配的元素也是如此。 这是通过对分组联接中的每个匹配元素序列调用 DefaultIfEmpty 来实现的。

重点就是into到集合,再DefaultIfEmpty()