8.1.1小节使用简单的LINQ查询表达式查询LinqDB数据库的UserInfo中的数据,且该查询中只涉及一个表(UserInfo),查询条件也相对简单。本小节介绍比较复杂的LINQ查询表达式,并在LINQ查询表达式使用join子句联接多个相关的表。
下面的实例代码使用LINQ to SQL查询LinqDB数据库中的UserInfo、UserRole和Role表中的数据,并在查询中使用join子句联接相关的表。具体步骤如下。
(1)创建LinqDBDataContext类的实例db。
(2)使用LINQ查询表达式查询UserInfo表中ID列的值小于10,且Username列的值的长度大于5的数据。其中,LINQ查询表达式为“from ur in db.UserRole join u in db.UserInfo on ur.UserID equals u.ID join r in db.Role on ur.RoleID equals r.ID where u.ID < 10 && u.Username.Length > 5 select new { Username = u.Username, RoleName = r.RoleName}”。
(3)在上述LINQ查询表达式中,使用“join u in db.UserInfo on ur.UserID equals u.ID”子句联接UserRole和UserInfo表,使用“join r in db.Role on ur.RoleID equals r.ID”子句联接UserRole和Role表。其中,UserInfo、UserRole和Role表之间的关系图如图所示。
(4)上述LINQ查询表达式的查询结果保存为result变量。其中,结果由UserInfo表的Username列的值和Role表的RoleName列的值组成。
(5)把result变量设置为GridView控件gvData的数据源,并绑定该控件的数据,显示查询结果。
private void ShowData()
{ ///创建LinqDB数据库的数据上下文的实例
LinqDBDataContext db = new LinqDBDataContext(LinqSystem.LinqDBConnectionString);
///获取所有角色
var result = from ur in db.UserRole
///联接UserInfo表
join u in db.UserInfo on ur.UserID equals u.ID
///联接Role表
join r in db.Role on ur.RoleID equals r.ID
where u.ID < 10 && u.Username.Length > 5
select new
{ ///选择用户名称和角色
Username = u.Username,
RoleName = r.RoleName
};
///绑定控件数据,并显示数据
gvData.DataSource = result;
gvData.DataBind();
}
Sample_08项目中的ComplexQuery.aspx页面测试了上述实例代码(ShowData()函数),测试结果如图所示。