<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      ADO.NET EF 4中 query.Where().Where()和動態組合lambda實現組合查詢的不同。

      我記得在ADO.NET EF 1.0中,如果用query.Where().Where()寫法生成的SQL比較弱智,就是嵌套一層一層的子查詢,那么再VS2010有沒有改進捏???我做個例子檢驗一下。

       

      新建一個ASP.NET MVC2的工程,數據庫就用SQL2000就有的Northwind,只用一個Customers表。

       

      直接在HomeController上加Query方法,默認情況下顯示全部。

      代碼

              [HttpGet]
              
      public ActionResult Query()
              {
                  
      using (var context = new NorthwindEntities())
                  {
                      
      return this.View(context.Customers.ToList<Customers>());
                  }
              }

       

      查詢表單代碼,如果textbox為空,就代表放棄這個條件。

      代碼

          <% using (this.Html.BeginForm())
             { 
      %>

              
      <fieldset>
                      
      <legend>搜索</legend>
                      
                      
      <div class="editor-label">
                          城市
                      
      </div>
                      
      <div class="editor-field">
                          
      <%: Html.TextBox("city",this.Request["city"]) %>
                      
      </div>
                      
      <div class="editor-label">
                          公司
                      
      </div>
                      
      <div class="editor-field">
                          
      <%: Html.TextBox("company", this.Request["company"])%>
                      
      </div>
                      
      <div class="editor-label">
                          聯系人
                      
      </div>
                      
      <div class="editor-field">
                          
      <%: Html.TextBox("contactName", this.Request["contactName"])%>
                      
      </div>
                      
      <p>
                          
      <input type="submit" value="搜索" />
                      
      </p>
              
      </fieldset>

          
      <% } %>

       

      使用query.Where().Where()實現的代碼

       

      代碼
              [HttpPost]
              
      public ActionResult Query(string city, string company, string contactName)
              {
                  
      using (var context = new NorthwindEntities())
                  {
                      var query 
      = context.Customers.AsQueryable<Customers>();
                      
      if (!string.IsNullOrEmpty(city))
                      {
                          query 
      = query.Where<Customers>(c => c.City == city);
                      }
                      
      if (!string.IsNullOrEmpty(company))
                      {
                          query 
      = query.Where<Customers>(c => c.CompanyName.Contains(company));
                      }
                      
      if (!string.IsNullOrEmpty(contactName))
                      {
                          query 
      = query.Where<Customers>(c => c.ContactName.Contains(contactName));
                      }
                      
      return this.View(query.ToList<Customers>());
                  }
              }

       

       

      動態使用表達式樹的代碼

      代碼
              [HttpPost]
              
      public ActionResult Query(string city, string company,string contactName)
              {
                  
      using (var context = new NorthwindEntities())
                  {
                      
                      var parameter 
      = Expression.Parameter(typeof(Customers));
                      var type 
      = typeof(Customers);
                      Expression expr 
      = Expression.Constant(true);
                      var methodInfo 
      = typeof(string).GetMethod("Contains"new Type[] { typeof(string) });
                      
      if (!string.IsNullOrEmpty(city))
                      {
                          expr 
      = Expression.And(expr,
                              Expression.Equal(Expression.Property(parameter, 
      "City"), Expression.Constant(city)));
                      }
                      
      if (!string.IsNullOrEmpty(company))
                      {
                          expr 
      = Expression.And(expr,
                              Expression.Call(Expression.Property(parameter, 
      "CompanyName"), methodInfo, Expression.Constant(company)));
                      }
                      
      if (!string.IsNullOrEmpty(contactName))
                      {
                          expr 
      = Expression.And(expr,
                              Expression.Call(Expression.Property(parameter, 
      "ContactName"), methodInfo, Expression.Constant(contactName)));
                      }

                      var lambda 
      = Expression.Lambda<Func<Customers, bool>>(expr, parameter);
                      
      return this.View(context.Customers.Where<Customers>(lambda).ToList<Customers>());
                  }
              }

       

       

      效果都是一樣滴

       那個這兩個方法生成的SQL有什么不同捏?用SQL SERVER Profiler監視的query.Where().Where()的結果發現,在ADO.NET EF 4已經不在嵌套的子查詢,已經智能滴合并了,但是用了sp_executesql這個存儲過程。

      代碼

      exec sp_executesql N'SELECT 
      [Extent1].[CustomerID] AS [CustomerID], 
      [Extent1].[CompanyName] AS [CompanyName], 
      [Extent1].[ContactName] AS [ContactName], 
      [Extent1].[ContactTitle] AS [ContactTitle], 
      [Extent1].[Address] AS [Address], 
      [Extent1].[City] AS [City], 
      [Extent1].[Region] AS [Region], 
      [Extent1].[PostalCode] AS [PostalCode], 
      [Extent1].[Country] AS [Country], 
      [Extent1].[Phone] AS [Phone], 
      [Extent1].[Fax] AS [Fax]
      FROM [dbo].[Customers] AS [Extent1]
      WHERE ([Extent1].[City] = @p__linq__0) AND ([Extent1].[CompanyName] LIKE @p__linq__1 ESCAPE N
      ''~'') AND ([Extent1].[ContactName] LIKE @p__linq__2 ESCAPE N''~'')',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000),@p__linq__2 nvarchar(4000)',@p__linq__0=N'Berlin',@p__linq__1=N'%Futterkiste%',@p__linq__2=N'%Anders%'

       

       

      動態組合表達式確沒用存儲過程,直接就一條SQL語句

      代碼

      SELECT 
      [Extent1].[CustomerID] AS [CustomerID]
      [Extent1].[CompanyName] AS [CompanyName]
      [Extent1].[ContactName] AS [ContactName]
      [Extent1].[ContactTitle] AS [ContactTitle]
      [Extent1].[Address] AS [Address]
      [Extent1].[City] AS [City]
      [Extent1].[Region] AS [Region]
      [Extent1].[PostalCode] AS [PostalCode]
      [Extent1].[Country] AS [Country]
      [Extent1].[Phone] AS [Phone]
      [Extent1].[Fax] AS [Fax]
      FROM [dbo].[Customers] AS [Extent1]
      WHERE (N'Berlin' = [Extent1].[City]AND ([Extent1].[CompanyName] LIKE N'%Alfreds%'AND ([Extent1].[ContactName] LIKE N'%Maria%')

       

       

      看來ADO.NET EF對于兩種方式生成的SQL還是區別對待的,如果只有一條WHERE語句,那么直接將Lambda轉換為SQL,如果是多條WHERE,還能優化SQL。所以如果是動態的AND AND AND查詢,兩種方式差不多,我覺得Where().Where()的方式可讀性更好,如果是比較復雜的查詢,比如帶OR的,還要用動態組合表達式樹的方式。

       

      posted @ 2010-08-27 16:41  subwayline13  閱讀(6156)  評論(12)    收藏  舉報
      主站蜘蛛池模板: 亚洲色一色噜一噜噜噜| 亚洲男人av天堂久久资源| 狠狠色噜噜狠狠狠狠色综合久av| 亚洲天堂亚洲天堂亚洲色图| 久久精品国产福利一区二区| 亚洲av二区国产精品| 最新国产AV最新国产在钱| 欧美怡春院一区二区三区| 国产成人精品2021欧美日韩| 久久精品| 在线涩涩免费观看国产精品| 国产精品亚洲欧美大片在线看| av深夜免费在线观看| 99国产欧美另类久久久精品| 精品国产一区二区三区性色| 国产精品免费看久久久| av在线中文字幕不卡电影网| 成人精品动漫一区二区| 久久99国内精品自在现线| 国产在线精品一区二区三区直播| 婷婷丁香五月亚洲中文字幕| 国产精品无码不卡在线播放| 资源新版在线天堂偷自拍| 国产成人精品永久免费视频| 亚洲香蕉av一区二区蜜桃| 国产肥臀视频一区二区三区| 亚洲一区二区乱码精品| 国内自拍av在线免费| 国精品无码一区二区三区在线| 韩国美女福利视频一区二区| 亚洲午夜无码久久久久蜜臀av| 中国女人熟毛茸茸A毛片| 国产极品粉嫩尤物一线天| 久久99精品久久久久麻豆| 成人无码一区二区三区网站| 色午夜一av男人的天堂| 亚洲一二三区精品与老人| 好爽毛片一区二区三区四| 久久国产成人午夜av影院| 精品久久久久久中文字幕202| 一区二区不卡国产精品|