0

我有這樣的問題: enter image description here使用表達式進行手動Linq-To-Sql映射是否有效?

Vehicle類型從具有屬性「ID」的類型EntityObject派生。

我想我得到爲什麼L2S無法將其轉換爲SQL-它不知道WHERE子句應該包括WHERE VehicleId == valueVehicleId btw是表格中的PK,而上面的對象模型中的屬性是「ID」。

我能用表達式樹贏得這個獎嗎?因爲創建Expression似乎很容易傳遞給SingleOrDefault方法,但是L2S仍然無法翻譯它?

我想成爲DDD友好的,所以我不想裝飾我的領域模型對象與ColumnAttributes等我很高興,但是我自定義我的L2S DBML文件,並添加表達式助手/無論在我的「數據層」希望將這種ORM業務遠離我的領域模型。

更新:

我沒有用我的select語句的對象初始化語法

。就像這樣:

private IQueryable<Vehicle> Vehicles() 
{ 
    return from vehicle in _dc 
     select new Vehicle() { ID = vehicle.VehicleId }; 
} 

我實際使用一個構造函數和from what I've read這將導致上述問題。這是我在做什麼:

private IQueryable<Vehicle> Vehicles() 
{ 
    return from vehicle in _dc 
     select new Vehicle(vehicle.VehicleId); 
} 

我明白,L2S不能表達式樹從屏幕抓取以上,因爲它不知道它通常會從對象初始化語法推斷的映射轉換。我怎樣才能解決這個問題?我是否需要使用屬性綁定來構建Expression

回答

0

我已經決定,這是不可能從進一步的經驗。

當在映射投影中使用參數化的ctor時,L2S根本無法創建正確的WHERE子句。這是傳統L2S映射投影中的初始化器語法,它給L2S提供了所需的上下文。

簡短的回答 - 使用NHibernate。

-1

簡答:不。

我曾嘗試將IQueryable <.IEntity>應用於Linq2Sql。我燒得不好。

正如你所說。 L2S(在這方面也是EF)不知道ID被映射到列VehicleId。您可以通過將Vehicle.ID重構爲Vehicle.VehicleID來解決此問題。 (是的,如果它們是相同的名稱,它們會工作)。但是我仍然不推薦它。

使用L2S和它提供的對象。使用IQueryable處理掩蓋其上的一層...是不好的IMO(根據我的經驗)。

其他方式是在完成select語句後執行.ToList()。這會將所有車輛加載到您的記憶中。然後你在Linq 2 Object集合中聲明.Where。當然,這不會像L2S處理所有查詢那樣有效,並導致更大的內存使用量。

長話短說。不要將Sql IQueryable與最初設計的對象以外的任何對象一起使用。它不起作用(好)。

+0

我想也許你誤解了我的問題。我害怕這一點 - 很難闡明這個問題。 我不會在我的存儲庫之外使用'IQueryable'。 此外,「你可以通過重構你的Vehicle.ID到Vehicle.VehicleID來解決這個問題(是的,他們工作,如果他們是相同的名稱)」是不正確的 - 將字段改爲'VehicleID'不會解決我的問題。綁定上下文受制於使用初始化器語法而不改變屬性名稱。這就是初始化語法的全部要點 - 無縫地從PropA映射到ProbB。 謝謝你的回答。 – 2011-05-23 01:36:53