簡體   English   中英

一個簡單的Linq To NHibernate查詢

[英]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.

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