zoukankan      html  css  js  c++  java
  • LINQ中join语法大探究(多表关联),也有不少疑问

    平时我们使用sql语句。一般很少只用一个表来做操作。大多数都要用到多个表的操作。那么多表关联就必不可少。
    在linq也提供这样的强大功能。但是毕竟sql语句和linq中的语法有些差异。导致linq中的关联操作比较join语法等不相同的。
    下面通过几个列子来说明这些操作
    工具vs2008beta2标准版和sqlserver2000
    我们知道其实linq最终还是生成了相应的sql来操作数据库的。如果对linq语法不明白可以通过linq生成的sql来看明白。
    datacontext有个属性Log很重要的啊。可以生成我们想看的sql
    如果建立的是控制台应用程序可以这样:datacontext.log = Console.out;
    如果是其他项目可以生成日志文件来查看。
    StreamWriter sw = new StreamWriter(Server.MapPath("sqlLog.txt"), true); // Append
    &<60;dc.Log = sw;
    。。。//执行代码
    sw.flush();
    sw.close();这样就可以拉

    这其中涉及建立上下文datacontext和数据库链接。已经实体类建立和linq to sql classes的设计器等这里是不做讲解的。可以查看其他文章
    本文以sqlserver2000的northwind为列

    第一个:
    &<60;DataClassesDataContext dc = new DataClassesDataContext();
    var infoQuery =
    from cust in dc.Customers
    from ord in dc.Orders
    where cust.City == "London"
    select ord;
    Page.Response.Write(infoQuery.Count().ToString()+"<br/>");
    这个执行后产生的sql如下
    SELECT COUNT(*) AS [value]
    FROM [dbo].[Customers] AS [t0], [dbo].[Orders] AS [t1]
    WHERE [t0].[City] = 'London'
    这就是简单的笛卡尔乘积拉。加了一个条件限制。结果就是customer表和orders的数量的乘积。
    第二个:
    var infoQuery =
    from prod in dc.Products
    where prod.Supplier.Country == "USA" && prod.UnitsInStock == 0
    select prod;
    products 和 suppliers 是有外键关联的 。对应的sql是这个:
    SELECT COUNT(*) AS [value]
    FROM [dbo].[Products] AS [t0]
    LEFT OUTER JOIN [dbo].[Suppliers] AS [t1] ON [t1].[SupplierID] = [t0].[SupplierID]
    WHERE ([t1].[Country] = 'USA') AND ([t0].[UnitsInStock] = 0)
    使用的左外键链接
    第三个:
    var infoQuery =
    from emp in dc.Employees
    from empterr in emp.EmployeeTerritories
    where emp.City == "Seattle"
    select new
    {
    emp.FirstName,
    emp.LastName,
    //empterr.Territory.TerritoryDescription
    };
    对应的sql

    SELECT COUNT(*) AS [value]
    FROM [dbo].[Employees] AS [t0], [dbo].[EmployeeTerritories] AS [t1]
    WHERE ([t0].[City] = 'Seattle') AND ([t1].[EmployeeID] = [t0].[EmployeeID])
    两个表没有链接。说实话我也头晕拉。select * from t1,t2 where这种写法在sqlserver是比较少用的。也不推荐使用
    第四个: var q =
    &&&&&&
    &&&&这个疑问比较多
    查询数量的时候产生sql如下

    SELECT COUNT(*) AS [value]
    FROM [dbo].[Customers] AS [t0]
    循环是这样:
    SELECT [t0].[ContactName], (
    &&&&FROM [dbo].[Customers] AS [t0]
    我看不懂了。哈哈

    还有个:
    &&&&&&&&&
    &&&&let这个表达式。
    SELECT [t1].[ContactName], [t2].[OrderID], [t1].[value]
    FROM (
    &&&CROSS JOIN [dbo].[Orders] AS [t2]
    WHERE [t1].[CustomerID] = [t2].[CustomerID]
    就是那个+号了

    本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

  • 相关阅读:
    hdu 5534 Partial Tree 背包DP
    Educational Codeforces Round 1 E. Chocolate Bar 记忆化搜索
    Educational Codeforces Round 1 D. Igor In the Museum bfs 并查集
    Educational Codeforces Round 1 B. Queries on a String 暴力
    Educational Codeforces Round 1 A. Tricky Sum 暴力
    Codeforces Round #282 (Div. 1) A. Treasure 水题
    hdu 5565 Clarke and baton 二分
    hdu 5563 Clarke and five-pointed star 水题
    Codeforces Testing Round #12 C. Subsequences 树状数组维护DP
    Codeforces Testing Round #12 B. Restaurant 贪心
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319490.html
Copyright © 2011-2022 走看看