(翻譯)Entity Framework技巧系列之一 - Tip 1 - 5

来源:http://www.cnblogs.com/wukeng/archive/2017/04/28/6782158.html
-Advertisement-
Play Games

本系列英文原文出自。 提示1. 在Entity Framework中怎樣排序關係(Relationships) 問題: 在Entity Framework論壇中常會看到關於排序相關聯項目的問題。 例如,想象你要查詢客戶,並返回那些欠款超過30的賬戶,與此同時檢索這些賬戶的訂單。 並且你需要將那些訂單 ...


本系列英文原文出自

提示1. 在Entity Framework中怎樣排序關係(Relationships)

問題:

    在Entity Framework論壇中常會看到關於排序相關聯項目的問題。

    例如,想象你要查詢客戶,並返回那些欠款超過30的賬戶,與此同時檢索這些賬戶的訂單。

    並且你需要將那些訂單按下單日期排序,這樣你可以首先看到最近的訂單,以便輕鬆的查找到可疑的行為。

答案:

大部分人們可能都知道EF中可以使用Include()即時載入一個關係。如下示例:

1 var lateCustomers = from c in ctx.Customers.Include("Orders") 
2                     where c.IsMoreThan30DaysInArrears 
3                     select c;

但不幸的是,這個語句返回的每個客戶的訂單都是無序的。

所以你怎樣排序這些訂單呢?嚴格地說沒有辦法。

但是你也可以做一些這樣的工作,如在select子句中進行include操作。

1 var lateCustomers = from c in ctx.Customers 
2                 where c.IsMoreThan30DaysInArrears 
3                 select new {  
4                     Customer = c,  
5                     Orders = c.Orders.OrderByDescending( 
6                                  o => o.OrderDate 
7                              )  
8                 }; 

這個語句使用標準的LINQ語義請求一個由客戶及其排序過的所有訂單組成的匿名類型的迭代。

Entity Framework可以很好的支持這種寫法所以問題得到解決…

補充知識:

以上做法有幾分…

我沒有使用實體來獲取數據,而是使用了其它東西 – 一個匿名類型。

這種方式不是很理想。

你很想通過customer.Orders屬性來訪問客戶的訂單。有趣的是即使名為Fix-up的東西已經實現了這個目標。

Entity Framework的對象服務會自動將相關聯的事物綁定在一起,這個過程就稱為Fix-up。

一般情況下,Fix-up這個過程發生在兩個相關聯的實體進入上下文的那一刻。

所以因為我已經載入了Customer與Orders兩者(通過投影),Fix-up也將會保證customer.Orders屬性包含那些訂單。這是我的查詢中沒有使用Include("Orders")的真正原因。

這迴避了問題,從而引出了新問題:Customer.Orders可以被排序嗎?

不幸的是,目前沒有官方解決方式。

這不是我們要支持的特性,我們沒有花時間 – 必要的時間來測試它,確保其可以在每種場景下工作。你知道那都是重要的QA問題。

雖然有反對者,但無論如何這可以工作…

為什麼呢?

我的猜測是在查詢中執行排序,編寫基於DataReader來實例化實體並最終進行Fix-up的代碼是有副作用的。

現在,理論上你可以在項目中使用這個特性…但是,註意這是個大大的轉折,請明白這是不推薦的。

依賴於一種有潛在的負面作用的特殊實現總是存在一點風險。

 

提示2. Entity Framework書籍

問題:

在哪可以找到深入學習Entity Framework的書籍?

答案:

在微軟產品小組的產品上做開發的一個好處是可以接觸到想讓你審閱他們書籍的作者。

    到目前為止我收到3位不同的作者發給我的他們的Entity Framework書籍的書稿。

如下是我按收到它們的順序:

 

ADO.NET Entity Framework - Unai Zorrilla Castro / Octavio Hernandez / Eduardo Quintas

這本書是用西班牙語寫的,本質上單一語言的,所以個人很難對其質量進行評論,但是我的阿根廷同事推薦這本書,對我這就足夠好了。儘管如此,我還是喜歡將其放在我的書架上,這讓我看起來很先進…所以謝謝Unai。

 

Programming Entity Framework - Julie Lerman

我與Julie進行過幾次個人會面,我知道她在這本上傾註了她的心血。所以這本將近800頁的書講的如此透徹也就不令人吃驚了。Julie的書中包含了大量有用的信息以及一些現實中的例子。

Julie,謝謝你的書。

 

Professional ADO.NET 3.5 with LINQ and the Entity Framework - Roger Jennings

我從沒見過Roger,但是從他的博客上可以明確的知道他使我們感覺可靠。他的書與Julie的書有一點不同,因為其講述了Entitiy Framework周圍其它一些事物,如LINQ to XML,LINQ to DataSet等。我昨天剛收到這本書(謝謝Roger),但是我相信其很有市場。

 

正如在這看到的這些很好選擇…

祝你的Entity Framework順利

 

提示3. 開始T4之旅

如果你讀過Entity Framework Design Blog,你應該已經聽我們討論過T4。這是一項與Visual Studio 2008一起發行的技術(2005有一個獨立的版本供下載)。

在.NET4.0中,Entity Framework使用了T4來增強代碼生成與模型初始化這種場景。

事實上T4現在也用在其它一大些微軟的產品,包括ASP.NET MVC和Dynamic Data。

所以考慮如果現在要開始使用T4並開始熟悉這種技術,你應該怎麼做?

事實上這種技術相對簡單。你可以非常輕鬆的完成相當有用的事情:

 

  • 向項目中添加一個文本文件,並將擴展名改為".tt"。
  • 在文本文件中寫入一些模版代碼。
    <#@import namespace="System.Collections.Generic" #>
    <#
    Dictionary<string,Type> properties = new Dictionary<string,Type>();
    properties.Add("Age",typeof(int));
    properties.Add("Firstname", typeof(string));
    properties.Add("Surname", typeof(string));
    #>
    using System;

    public class <#="MyClass"#>{
    <# foreach(string name in properties.Keys) { #>
        public <#=properties[name].Name#> <#=name#>{
            get; set;
        }
    <# } #>
    }

這些模版代碼生成了一個類,並使用了一個名為"properties"的字典的每一個Key作為這個類的屬性。

  • 保存".tt"文件。當你完成這一步時,不可思議的會自動出現一個依賴於模版的".cs"文件,其看來像下麵這樣:
     1 using System; 
     2 
     3 public class MyClass{ 
     4       public Int32 Age{ 
     5             get; set; 
     6       } 
     7       public String Firstname{ 
     8             get; set; 
     9       } 
    10       public String Surname{ 
    11             get; set; 
    12       } 
    13 }

     

正如你看到的,T4非常簡單且對熟悉ASP.NET的使用者來說相當容易使用…

試一下吧。

 

提示4. 概念模式定義語言規則

    第一個版本的Entity Framework在不久以前隨著.NET 3.5 SP1一些發佈了。

    Entity Framework文檔的一個最大漏洞是缺少一個對CSDL(概念模式描述語言)的正式文檔描述。

人們想瞭解的CSDL是Entity Framework用來描述實體數據模型(EDM)的具體格式。

這些規則可以由嵌入System.Data.Entity.dll程式集資源中的XSD推到而出,但是一大些規則靠Entity Framework本身來限制。

    如果你對這些規則的細節感興趣,可以參見formal CSDL specification here

    這份文檔主要針對Astoria所使用的CSDL1.1版本,但是CSDL1.0與1.1版本的大部分是相同的,這些差異都明確的列於這裡

免責聲明:我幫助編輯了這個文檔的一些部分。如果你存在問題請告訴我。

 

提示5. 如何限制EF查詢返回的類型

    考慮你有一個如下這樣的模型:

 

怎樣僅僅查詢Cars?

 

這是OfType<SubType>()登場的時候。你編寫如下這樣的代碼:

1 var onlyCars = from car in ctx.Vehicles.OfType<Car>() 
2                select car;

且這個可以很好的工作。這將結果限制在Cars,附帶包含了Cars,Sports

怎樣僅查詢Cars而不附帶其子類型?

考慮你的預算只夠選擇一個簡單的家用轎車。這意味著你不想要SUV與運動轎車(SportsCars)。

你需要在查詢中明確限制以避免返回所有的子類型:

1 var onlyCars = from car in ctx.Vehicles.OfType<Car>() 
2                where !(car is SportsCar) && !(car is SUV) 
3                select car;

現在你的代碼僅返回Cars類型的對象。

外傳

這種解決方案唯一令人遺憾的是你不得不顯示排除所有你可能不想要的子類型,在某些有多級繼承或一級中有大量派生類的情況下可能會有很多子類。

如果下麵的寫法被支持將會更好(可惜這是不支持的):

1 var onlyCars = from car in ctx.Vehicles.OfType<Car>() 
2                where car.GetType() == typeof(Car) 
3                select car;

問題是你認為支持這種類型的查詢對我們有多重要呢?

 

BTW:C#數據結構與演算法系列翻譯停止,原因嗎..此書早已有中文版(詳見)面世,我就不重覆造輪子了..

參考頁面:http://qingqingquege.cnblogs.com/p/5933752.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Visual Studio 我們在Windows平臺上開發應用程式使用的工具主要是Visual Studio.這個集成開發環境已經演化了很多年,從一個簡單的C++編輯器和編譯器到一個高度集成、支持軟體開發整個生命周期的多語言環境。 Visual Studio以及它發佈的工具和服務提供了:設計、開發、 ...
  • 在開發Windows服務程式時,我們一般需要添加安裝程式,即:serviceInstaller,裡面有幾個關於名稱屬性,你都搞明白了嗎? 1.Description:表示服務說明(描述服務是乾什麼的); 2.DisplayName:表示友好名稱,可以理解為服務名的別名; 3.ServiceName: ...
  • 從編程的角度來講,ASP.NET Web API針對CORS的實現僅僅涉及到HttpConfiguration的擴展方法EnableCors和EnableCorsAttribute特性。但是整個CORS體系不限於此,在它們背後隱藏著一系列的類型,我們將會利用本章餘下的內容對此作全面講述,今天我們就來 ...
  • 為什麼要使用StringBuilder 為什麼要使用StringBuilder 為什麼要使用StringBuilder 為什麼使用StringBuilder要從string對象的特性說起。 為什麼使用StringBuilder要從string對象的特性說起。 string對象在進行字元串拼接時,因為 ...
  • 簡介 簡介 對於.net來說,用web api來構建服務是一個不錯的選擇,都是http請求,調用簡單,但是如果真的要在程式中調用,則還有些工作要做,比如我們需要手寫httpClient調用,並映射Model, 如果服務少還可以,多了就繁瑣了。 Swagger Swagger 關於Swagger的信息 ...
  • 我們在上面對ASP.NET Core預設提供的具有跨平臺能力的KestrelServer進行了詳細介紹(《聊聊ASP.NET Core預設提供的這個跨平臺的伺服器——KestrelServer》),為了讓讀者朋友們對管道中的Server具有更加深刻的認識,接下來我們採用實例演示的形式創建一個自定義的 ...
  • 概述: ASP.NET Web API 的好用使用過的都知道,沒有複雜的配置文件,一個簡單的ApiController加上需要的Action就能工作。但是在使用API的時候總會遇到跨域請求的問題, 特別各種APP萬花齊放的今天,對API使用者身份角色驗證是不能避免的(完全開發的API不需要對使用者身 ...
  • 本節所謂的“配置同步”主要體現在兩個方面:其一,如何監控配置源併在其變化的時候自動載入其數據,其目的是讓應用中通過Configuration對象承載的配置與配置源的數據同步;其二、當Configuration對象承載的配置放生變換的時候如何嚮應用程式發送通知,最終讓應用程式使用最新的配置。 一、配置 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...