[英]Best way to use LINQ to Entities with a Collection Property
[英]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.