簡體   English   中英

LINQ to Entities-實現此目的的最佳方法?

[英]LINQ to Entities - Best way to accomplish this?

好的,我主要是LAMP開發人員,所以我是實體框架的新手。 但是,我熟悉LINQ的基礎知識,並且已經從我的數據庫生成了一個實體模型。 現在這是我的要求:

我在WinForm上有一個數據網格,每隔幾秒鍾就會從遠程服務器上的數據源刷新一次,因為對數據集的更改是從其他源進行的。 顯然,我想構造一個lambda表達式來獲取正確的匿名類型,以滿足需要在我的數據網格中顯示的列。 我已經做到了,這就是結果(我正在使用自定義datagrid控件,順便說一句):

替代文字

到目前為止,我的代碼是:

Models.dataEntities objDB = new Models.dataEntities();

var vans = from v in objDB.vans
           select v;

gcVans.DataSource = vans;

好的,現在我有了基本數據集。 我遇到的一個問題是“狀態”列將基於數據集中的幾個參數顯示一個計算出的字符串。 我通過局部類將其添加到我的實體中。 正如您在屏幕截圖中所看到的,這可以正常工作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1.Models {

    public partial class van {

        public string van_status {

            get {

                if (this.is_offline == 1) {

                    return "Offline";

                } else if (this.is_prayer_room == 1) {

                    return "In Prayer Room";

                } else {

                    return "TODO: Create statuses";

                }

            }

        }

    }

}

此添加的屬性工作正常。 但是,第二次我嘗試以匿名類型投影狀態,以便我也可以檢索學校名稱,但出現錯誤:

Models.dataEntities objDB = new Models.dataEntities();

var vans = from v in objDB.vans
           select new {

               van_name = v.van_name,
               school_name = v.school.school_name,
               capacity = v.capacity,
               phone = v.phone,
               van_status = v.van_status

           };

gcVans.DataSource = vans;

替代文字

因此,我有兩個問題:

1)如果我不能在LINQ投影中使用局部類的計算屬性,應該如何在我的數據網格中顯示我的計算字符串?

2)我什至正確地做到了嗎? 當我解決#1時,如何刷新此數據(即在計時器觸發事件​​期間)? 我會簡單地調用objDB.refresh() ,然后告訴我的datagrid從數據源進行更新嗎? 調用該方法是否實際上在上面運行了lambda表達式,還是從數據庫加載了所有內容?

感謝您的協助。 此外,如果您有任何最佳做法可以分享,那就太好了! 我希望我能在您需要協助的情況下詳盡地解釋這一點。

1)不必使用局部類來修改EF對象,您始終可以創建自己的包含只讀屬性van_status的類。 您獲得的代碼幾乎相同:

Models.dataEntities objDB = new Models.dataEntities();
gcVans.DataSource = from v in objDB.vans
           select new DisplayVan {
               van_name = v.van_name,
               school_name = v.school.school_name,
               capacity = v.capacity,
               phone = v.phone,
           };

van_status屬性是只讀的,因此無需在查詢中指定。

2)我不是Web開發人員,而是桌面開發人員,因此,我將向您介紹如何刷新網格(對於胖客戶端來說,它可能不是首選的方法)...

我不願意信任.Refresh()方法,並希望所有方法都能最大限度地提高效率並正常工作。 而是將#1中的代碼封裝到您自己的方法中,並從計時器事件觸發中調用它(或者您選擇實施定期刷新)。

另一個不錯的選擇是創建一個擴展方法。

這是一個簡單的示例:

using System;

namespace WindowsFormsApplication1 {
    static class Program {
        [STAThread]
        static void Main() {
            Van van = new Van();
            string status = van.GetStatus();
        }
    }

    public static class VanExtension {
        public static string GetStatus(this Van van) {
            if(van.is_offline == 1) {
                return "Offline";
            }
            else if(van.is_prayer_room == 1) {
                return "In Prayer Room";
            }

            return "TODO:  Create statuses";
        }
    }

    public class Van {
        public int is_offline { get; set; }
        public int is_prayer_room { get; set; }
    }
}
  • 確保將此擴展類放置在與實體類相同的名稱空間中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM