[英]A simple Linq To NHibernate Query
我想要實現的目標必須很簡單,但我無法使其正常工作。 我有一個簡單的表,其中包含一個ID和一個說明字段。
像這樣:
Medium ----------- Id Description ---------- 1 Watercolour 2 Oil 3 Etching 4 Other
因為用戶將有機會從網格中選擇任何項目。 我需要發出一個Linq to NHibernate查詢來獲取用戶選擇的項目。
我有以下測試:
[Test]
public void LinqToNHibernate_Queries_Test()
{
InSession(session =>
{
_mediumRepository = new NHibernateRepository<Medium>(session);
Action<string> insertMedium = (description) =>
{
var medium = new Medium
{
Id = 0,
MediumDescription = description
};
_mediumRepository.SaveOrUpdate(medium);
};
insertMedium("Watercolours");
insertMedium("Oils");
insertMedium("Etchings");
insertMedium("Other");
var itemIds = new[] { "2" , "4" }.Aggregate((x, y) => x + "," + y);
//var itemIds = new ItemId[] {new ItemId {Id = 2}, new ItemId {Id = 4}};
//var items = _mediumRepository.GetAll().Where(med => itemIds.Any(i => i == med.Id));
var items = _mediumRepository.GetAll().Where(med => itemIds.Contains(med.Id.ToString()));
//var mediums = _mediumRepository.GetAll();
//var items = mediums.Join(itemIds, m => m.Id, i => i.Id, (m, i) => m);
Assert.AreEqual(2, items.Count());
});
我嘗試了許多不同的方法,包括Any運算符,但無濟於事。 我通過這種特殊嘗試得到的錯誤是System.NotSupportedException:System.String ToString()
我想我要做的就是獲取子查詢中存在ID的許多記錄。 在此示例中,我要獲取介質表中ID為2或4的所有記錄。
我正在針對測試和SQL 2005生產中的SQLite數據庫使用Linq To NHibernate v3.0。 順帶一提,Linq To SQL和SQL 2005可以使用相同的查詢。
正如我所說的,這種類型的查詢必須很常見,並且我確定我要有一個“ DOH !!!”。 你們其中一個聰明的人提供答案的那一刻。
在大多數Linq to ORM實現(包括Linq2NH)中,方法調用和迭代構造通常會碰碰運氣。 這是因為在大多數情況下,該框架實際上並不運行lambda。 而是檢查每個表達式節點的lambda的IL,然后根據已知模式進行匹配,將條件反向工程為SQL表達式(在Linq2NH中,它實際上轉換為NH標准)。 如果lambda包含一個方法,即使服務器端代碼可以訪問該方法,該框架也經常會因為無法將方法調用轉換為SQL而煩惱。
我不會在此特定查詢中使用Linq。 請嘗試ICriteria設置,然后將Expression.InG(med.Id.ToString(),itemIds)添加到條件中。
正如KeithS建議的那樣,Linq2NH的實現確實在ToString方法上受挫。 如果我將查詢更改為
var itemIds = new[] { 2, 4 };
var items = _mediumRepository.GetAll().Where(med => itemIds.Contains(med.Id));
Assert.AreEqual(2, items.Count());
然后我的測試通過了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.