我有一個情況,我有一張我將要查詢的條目表,但在某些情況下,我會提供其他信息。例如,如果我有一個表people
,我希望能夠按名稱進行搜索,但我也希望存儲一些座標並根據其位置進行搜索,但也會在對象模型中顯示該距離。所以,舉例來說,假設我people
表看起來是這樣的:如何使用EF Code First表示選項計算欄?
PersonId int
Name nvarchar(100)
Address nvarchar(100)
Latitude float(10,6)
Longitude float(10,6)
與實體類的定義是這樣的:
public class Person
{
public int PersonId { get; set; }
public sting Name { get; set; }
public float Latitude { get; set; }
public float Longitude { get; set; }
}
然後,我可以很容易地使用名字來找到一個人:
var people = from p in myDb.People where p.Name.Contains("joe");
現在,我已創建了用戶定義的函數,稱爲CalculateDistance
,用於處理此距離計算。因此,我的SQL將如下所示:
String sql = "SELECT *, dbo.CalculateDistance(" + location.X + ", " + location.Y + ", Latitude, Longitude) AS Distance FROM people ORDER BY Distance
如何在代碼中表示此代碼?我嘗試在類中添加如下屬性:
public virtual float Distance { get; set; }
但是,名稱查詢失敗,因爲沒有「距離」列。我也嘗試擴展Person類:
public class PersonWithDistance: Person {
public float Distance { get; set; }
}
但是這樣會導致映射生成方式出現更多問題。
什麼是正確的方式來實現這樣的事情?我是否必須爲距離查詢的結果創建一個完全獨立的單獨的類?
我使用計算列(也因爲我想排序)。你可以添加'[DatabaseGenerated(DatabaseGeneratedOption.Computed)]',EF不會爲這個列打擾你。在Code First中,它甚至會爲你創建列,然後使用EF Migrations進行自定義遷移列,添加函數,並重新添加列'ADD COLUMN Foo AS([dbo]。[CalculateDistance]([Column1],[Column2]))' – kamranicus 2012-03-17 22:57:07
@subkamran你應該使這個答案 – mcalex 2014-08-21 03:41:18