EF中跨表查询:
使用上一篇的方式,只能获取当前记录的字段数据,无法获取与其相关的记录数据,
在DbQuery类提供include()方法用来在查询中获取相关记录的数据:
Include (string path) --> path:配置的关系的导航属性
每个Product记录都有相关的ProductType(产品类别)
demo:
/// <summary>
/// 跨表连接查询
/// </summary>
public static void AcrossTableQuery()
{
using (CRMDBEntities cRMDBEntities = new CRMDBEntities())
{
//Include方法:用在表之间存在主外键关系的查询
Product product = cRMDBEntities.Product.Include("ProductType").Where(p => p.ProductNo == 1007).Single<Product>();
Console.WriteLine("ProductName:" + product.ProductName + "\tProduct Type:" + product.ProductType.TypeName);
}
}
debugger调试:快速监视
相关的ProductType记录也被查询出来了。
查询出相关的数据集合:
/// <summary>
/// 查询出数据集合
/// </summary>
public static void AcrossTableQuery01()
{
using (CRMDBEntities cRMDBEntities = new CRMDBEntities())
{
//子表连接到主表
var productList = cRMDBEntities.Product.Include("ProductType").Where(p => p.TypeId == 5);//延迟执行
List<Product> products = productList.OrderBy(p => p.ProductNo).ToList();//立即执行
products.ForEach(p => { Console.WriteLine("Product Name:" + p.ProductName + "\tProduct Type:" + p.ProductType.TypeName); });
}
}
/// <summary>
/// 查询出数据集合
/// </summary>
public static void AcrossTableQuery02()
{
using (CRMDBEntities cRMDBEntities = new CRMDBEntities())
{
//主表连接子表(1:N关系)
var productTypeList = cRMDBEntities.ProductType.Include("Product").Where(pt => pt.TypeId == 5);//延迟执行
ProductType productType = productTypeList.Single();//获取当前的ProductType记录
List<Product> productList = productType.Product.ToList();//获取和ProductType记录相关联的所有Product记录
productList.ForEach(p => { Console.WriteLine("Product Name:" + p.ProductName + "\tProduct Type:" + productType.TypeName); });
}
}
这里提到一个LINQ的延迟执行(并没有提交sql语句到数据库,与数据库进行交互),而是调用toXXX()方法才立即执行.
同样使用profiler监视,debugger调试演示:
第一句代码已经执行,tracing显示台仍然为空
再执行下一条,发现生成了sql