亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

.NET深入實戰系列—LinqtoSql進階

2019-11-14 14:02:27
字體:
來源:轉載
供稿:網友

最近在寫代碼的過程中用到了Linq查詢,在查找資料的過程中發現網上的資料千奇百怪,于是自己整理了一些關于Linq中容易讓人困惑的地方。

本文全部代碼基于:UserInfo與Class兩個表,其中Class中的UserId與UserInfo中的Id對應

image

 本文唯一訪問地址:http://www.49028c.com/yubaolee/p/BestLinQQuery.html

linq聯合查詢

內聯查詢

內聯是一個實際使用頻率很高的查詢,它查詢兩個表共有的且都不為空的部分

 from user in UserInfo join c in Classes on user.Id equals c.UserId select new {     user.UserName,     user.Id,	 c.ClassName }

查詢結果

image

對應的SQL語句

SELECT [t0].[UserName], [t0].[Id], [t1].[ClassName]FROM [UserInfo] AS [t0]INNER JOIN [Class] AS [t1] ON [t0].[Id] = [t1].[UserId]

左聯查詢

左聯應該是聯合查詢中使用頻率最高的查詢。它以左表為準,進行聯合查詢。如果右表中不存在對應的結果,則置空。(注意:在Linq中是不存在右聯連的說法,因為右聯無非是把左邊的表移動到右邊,查詢的結果與左聯是一樣的)

from user in UserInfo  join c in Classes on user.Id equals c.UserId into temp  from c in temp.DefaultIfEmpty()  select new  {       user.UserName,       user.Id,       c.ClassName  }  

查詢結果

image

對應SQL語句

SELECT [t0].[UserName], [t0].[Id], [t1].[ClassName] AS [ClassName]FROM [UserInfo] AS [t0]LEFT OUTER JOIN [Class] AS [t1] ON [t0].[Id] = [t1].[UserId]

!注意一下左聯那個【temp】,它其實是一個IEnumerable集合。所以我們可以得到到左聯的另一種結果:

from user in UserInfojoin c in Classes on user.Id equals c.UserId into tempselect new{	user,	temp}

查詢結果(為了更明確表達集合,在Class表里特別加了一條記錄,所以class那邊共有3條)

image

對應SQL語句,與左聯的SQL基本一樣,但多了一個統計行數的列

SELECT t0.*, [t1].[Id] AS [Id2], t1.*, (    SELECT COUNT(*)    FROM [Class] AS [t2]    WHERE [t0].[Id] = [t2].[UserId]    ) AS [value]FROM [UserInfo] AS [t0]LEFT OUTER JOIN [Class] AS [t1] ON [t0].[Id] = [t1].[UserId]

全聯接

全聯連是得到兩個表的交叉結果(在SQL中稱為cross join),這種聯連方式得到的結果在沒有過濾條件的情況下,基本沒什么用??纯醇纯?,代碼如下:

 from user in UserInfo from c in Classes select new {     user.UserName,     user.Id,	 c.ClassName }

查詢結果

image

對應SQL語句

SELECT [t0].[UserName], [t0].[Id], [t1].[ClassName]FROM [UserInfo] AS [t0], [Class] AS [t1]

合并(Union)

這種查詢其實也很少用,但在某些變態業務需求下會非常有用,注意查詢的結果。它是合并兩個表相同列數的結果,并且如果結果中有相同的行,那么只取一行記錄。

(	from userinfo in UserInfo	select new {	  Id = (System.Int32?)userinfo.Id,	  Name = userinfo.UserName	}).Union(	from c in Classes	  select new {	  Id = (System.Int32?)c.UserId,	  Name = c.ClassName	})

查詢結果

image

對應SQL語句

SELECT [t0].[Id] AS [value], [t0].[UserName]FROM [UserInfo] AS [t0]UNIONSELECT [t1].[UserId] AS [value], [t1].[ClassName]FROM [Class] AS [t1]

Linq 分組查詢

分組查詢(group by)也是我們在實際項目中一個常用的操作,查詢操作如下:

from c in Classesgroup c by c.UserId into tempselect temp

查詢結果

image

 

注意一下查詢結果,外層是一個我們常用的IQueryable<T>,里面是一個類似Dictionary的K-V集合。簡單點說Group返回的是一個集合的集合,因此輸出時需用雙重循環。

我們在使用它的結果時,應該這樣調用:

 var result = from c in _context.Classes                group c by c.UserId                into temp                select temp;            foreach (var c in result)            {                Console.WriteLine(c.Key);                foreach (var citem in c)                {                    Console.WriteLine(citem.ClassName);                }            }

實體增加字段處理

我在本文例子中的UserInfo實體類如下:

 public partial class UserInfo    {        public int Id { get; set; }        public string UserName { get; set; }        public string UserType { get; set; }        public int Money { get; set; }    }

現在我想在該實體中類中添加一個屬性。為了保持原實體類的純潔。我添加一個新的partial類:

public partial class UserInfo    {        /// <summary>        /// 測試擴展屬性        /// </summary>        public string UserExt        {            get { return UserName + ":" + UserType; }        }    }

然后我們用EF訪問一下,發現是可以訪問的:

image

但如果我們這樣使用時:

from user in _context.UserInfoesselect new{    user.Id,    user.UserExt};

會發現編譯是沒有問題的。但運行時會出現下面異常:

image

具體錯誤信息如下: The specified type member 'UserExt' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation PRoperties are supported.

即"UserExt"類型并不能被linq支持。因為在進入到foreach進行真正取數據之前。EF已經把linq轉成SQL語句,而UserExt會被轉成對應的數據庫字段。因為數據庫中并沒有該字段,所以會出現這個問題。解決的方法很簡單:

from user in _context.UserInfoes.ToList()select new  {      user.Id,      user.UserExt  }; 

即先執行ToList(),提前讓linq進行執行,生成UserInfo集合,這樣就可以正常訪問UserExt了。別看這個小小的改動。在多表聯查過濾字段的情況下,你會體會到無盡的妙處!

你可能會想到一個問題,如果我再加一個完整的屬性會出現什么情況?

 public partial class UserInfo    {        public string UserExt        {            get { return UserName + ":" + UserType; }        }        //新增一個完整的屬性        public string UserExt2 { get; set; }    }

上面的UserExt2是我們新加入的一個屬性,現在我們來執行一下查詢。我想真正去研究過Linq的人肯定知道結果了。

image

在Linq操作中實體中的屬性必須在配置映射時指定。我們的數據庫中當然沒有UserExt2這個字段,所以增加Ignore標識,或調用一下:

this.Ignore(t => t.UserExt2);

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91高潮精品免费porn| 成人中心免费视频| 亚洲午夜久久久久久久| 在线视频日本亚洲性| 欧美性高跟鞋xxxxhd| 精品久久久久久亚洲精品| 久久久久五月天| 国产精品高清免费在线观看| 亚洲毛片在线免费观看| 久久精品人人做人人爽| 亚洲男人天堂九九视频| 久久久亚洲天堂| 精品国产1区2区| 国产成+人+综合+亚洲欧美丁香花| 亚洲精品欧美一区二区三区| 国产第一区电影| 久久久亚洲精选| 成人欧美一区二区三区在线| 日本精品免费一区二区三区| 久久精品视频亚洲| 欧美国产中文字幕| 国产精品国产三级国产专播精品人| 精品久久久久久久久久久久久| 久久天天躁狠狠躁老女人| 欧美色视频日本高清在线观看| 国产精品手机播放| 97热在线精品视频在线观看| 欧美激情视频一区| 欧美性猛交xxxx乱大交极品| 亚洲精品欧美日韩| 在线观看亚洲视频| 亚洲三级免费看| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品久久久久久久美男| 欧美性在线视频| 国内精品久久久久久中文字幕| 国产精品成熟老女人| 狠狠躁夜夜躁人人爽超碰91| 亚洲欧洲国产一区| 欧美激情视频一区| 日韩精品黄色网| 欧美色欧美亚洲高清在线视频| 久久91精品国产| 精品高清一区二区三区| 欧美在线观看www| 久久香蕉频线观| 中文字幕亚洲欧美日韩在线不卡| 91在线无精精品一区二区| 国产成人精品在线| 日韩免费高清在线观看| 中文字幕av一区二区三区谷原希美| 日韩中文字幕免费视频| 久久久91精品国产| 国产大片精品免费永久看nba| 国产精品爽黄69| 国产精品久久久久国产a级| 亚洲电影成人av99爱色| 成人网址在线观看| 久久影视三级福利片| 日本中文字幕久久看| 国产精品入口日韩视频大尺度| 成人写真福利网| 亚洲第一精品夜夜躁人人躁| 欧美亚洲视频一区二区| 国产视频精品自拍| 91av免费观看91av精品在线| 久久精品久久久久| 7777免费精品视频| 亚洲qvod图片区电影| 亚洲综合一区二区不卡| 欧美黑人xxxx| 富二代精品短视频| 久久久噜噜噜久久久| 国产日韩换脸av一区在线观看| 岛国精品视频在线播放| 中国人与牲禽动交精品| 欧美色欧美亚洲高清在线视频| 亚洲热线99精品视频| 在线视频精品一| 国产成人avxxxxx在线看| 亚洲国产私拍精品国模在线观看| 欧美性xxxx极品hd欧美风情| 国内精品久久久久久中文字幕| 午夜精品蜜臀一区二区三区免费| 精品女厕一区二区三区| 国产精品久久久久久网站| 狠狠躁18三区二区一区| 久久琪琪电影院| 永久免费精品影视网站| 日韩电影中文字幕| 91高清视频在线免费观看| 久久精品男人天堂| 一区二区三区四区在线观看视频| 亚洲欧美综合区自拍另类| 日韩中文字幕在线观看| 久久久av一区| 久久精视频免费在线久久完整在线看| 午夜精品久久久久久99热软件| 国产成人精品综合| 欧美亚洲国产日韩2020| 欧美日韩福利在线观看| 欧美视频二区36p| 欧美专区第一页| 91精品啪在线观看麻豆免费| 色777狠狠综合秋免鲁丝| 97av在线影院| 欧美美最猛性xxxxxx| 国产精品一区=区| 亚洲成人999| 欧美黄色片视频| 色中色综合影院手机版在线观看| 久久精品小视频| 亚洲一区二区三区sesese| 国产精品自拍偷拍| 欧美激情视频一区二区三区不卡| 91av在线不卡| 亚洲国产又黄又爽女人高潮的| 在线播放国产一区中文字幕剧情欧美| 国产91精品青草社区| 亚洲欧美日韩国产成人| 中文字幕成人精品久久不卡| 亚洲成色777777女色窝| 一区二区成人av| 国语自产精品视频在线看一大j8| 日韩美女在线观看| 97视频在线观看免费高清完整版在线观看| 国产精品欧美日韩| 欧美黄色www| 亚洲国产精品久久精品怡红院| 国产精品入口夜色视频大尺度| 久久夜色精品国产欧美乱| 黑丝美女久久久| 欧美老女人在线视频| 欧美在线视频一区二区| 欧美疯狂性受xxxxx另类| 日韩欧美在线字幕| 亚洲国产精品福利| 国产在线播放不卡| 欧美性高潮床叫视频| 亚洲人成电影在线| 久久久久久久久91| 精品激情国产视频| 91av在线不卡| 97色伦亚洲国产| 国产精品国语对白| 中文字幕成人精品久久不卡| 成人a在线视频| 久久精品在线视频| 九九热这里只有在线精品视| 国产精品一区二区av影院萌芽| 国产精品视频自在线| 亚洲最大的网站| 欧美视频一区二区三区…| 91精品久久久久久久久青青| 欧美在线一级va免费观看| 久久久精品999| 欧洲午夜精品久久久| 国产精品黄视频| 久久青草福利网站| 黄色一区二区在线观看| 亚洲高清免费观看高清完整版| 久久视频在线视频| 亚洲字幕一区二区| 成人午夜在线视频一区|