一、前言
在做項目中,我們會經常使用到 in 查詢語句。那么如果我們用 EF 和 Linq 怎么寫?接下來看代碼
二、實例
我使用的是區域查詢的例子,基本的 sql 語句如下:
SELECT * FROM Directories_AdministrativeDivision WHERE id IN ('5201','520102','520103','520111','520112','520113')
查詢效果展示:
如果是 EF 查詢:
我們要將 in 的數據封裝為 list ,按我這的個例子的話,我是通過遞歸調用的方法,獲取當 id=5201 下的所有區域。遞歸調用的方法如下。
//定義 set 列表 private HashSet<string> ids = new HashSet<string>(); /// <summary> /// 遞歸獲取區域id /// </summary> /// <param name="adId">用戶的屬地</param> public void getAdId(string adId) { ids.Add(adId); var ad2 = _administrativeDivisionRepository.GetAll().Where(x => x.ParentId == adId).ToList(); foreach (AdministrativeDivision a in ad2) { ids.Add(a.Id); getAdId(a.Id); } }
EF 的 in 查詢的代碼如下:
public void SeachAdministrativeDivision() { var ad = _administrativeDivisionRepository .GetAll() .Where(x => ids.Contains(x.Id));//這里就是 In 查詢 }
如果是 Linq 的查詢:
我們需要將獲取的 list 變為 (‘xx’,‘xxx’)的樣式,因為 Linq 查詢和 SQL 語句是非常相似的。轉化代碼如下:
string[] array = ids.ToArray(); string str = "("; for (int i = 0; i < ids.Count; i++) { if (i == array.Length - 1) { str += "'" + array[i] + "')"; } else { str += "'" + array[i] + "',"; } }
Linq 的查詢代碼如下
var queryAdministrativeDivision = _administrativeDivisionRepository .GetAll(); var query = from ad in queryAdministrativeDivision where str.Contains(ad.Id) //這里是 in 查詢 select ad;
最簡單的辦法,就是不用 in 查詢,直接使用 ef 的應該屬性,叫 Entity Framework 4.1 Linq Contains and StartsWith 就用可以了。
public void SeachAdministrativeDivision() { var ad = _administrativeDivisionRepository .GetAll() .Where(x => x.Id.StartsWith("52"));//StartsWith }
三、小結
小結就是需要學習的東西還很多,我們需要更加的努力!