首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过linq查询在fluent nHibernate中选择最小数量的项目?

如何通过linq查询在fluent nHibernate中选择最小数量的项目?
EN

Stack Overflow用户
提问于 2021-02-03 04:42:59
回答 2查看 28关注 0票数 0

所以我得到了一个流畅的nHibernate表,如下所示:

代码语言:javascript
运行
复制
public class AnsweredQuestionDb
{
    public virtual long Id { get; set; }
    public virtual QuestionDb Question { get; set; }
    public virtual AnswerDb Answer { get; set; }

}

QuestionDb和AnswerDb是另外两个流畅的nHibernate表。

所以我想选择答案最少的问题。因此,如果问题A被分析了3次,问题B,C和D回答了4次,那么结果应该是问题A。

这就是我实际使用的观点:

代码语言:javascript
运行
复制
var leastAnswerdQuestion = (from t in m_dbSession.Query<AnsweredQuestionDb>()
                            group t.Id by t.Question into groups
                            select groups.ToList().Sum()).ToList()[0];

但这抛出了一个异常,并且内部没有或order by。这能在一个查询中完成吗?

我希望我想做的事情已经很清楚了。

我假设在sql中,这将如下所示:

代码语言:javascript
运行
复制
SELECT Question_id, count(Question_id)
FROM AnsweredQuestionDb
GROUP BY Question_id
ORDER By count(Question_id)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-04 02:12:42

因此,在Svyatoslav Danyliv的帮助下,我创建了这个:

当然,这不是完美的,但它可以满足钱包的需求:

代码语言:javascript
运行
复制
QuestionDb nextQuestion = null;
var grouped =  (from t in m_dbSession.Query<AnsweredQuestionDb>()
               group t by t.Question.Id into g
               orderby g.Count()
               select new
               {
                   QuestionId = g.Key,
                   Count = g.Count()
               }).ToList();

var keys = grouped.Select(o => o.QuestionId).ToList();
var notAnswered = (from t in m_dbSession.Query<QuestionDb>()
                   where 
                   !keys.Contains(t.Id)
                   select t).ToList().First();

if (notAnswered != null)
{
    nextQuestion = notAnswered;
}
else
{
    if (grouped.Count() == 0)
    {
        nextQuestion = (from t in m_dbSession.Query<QuestionDb>()
                        select t).ToList().First();
    }
    else
    {
        var leastAnsweredId = grouped
            .OrderBy(x => x.Count)
            .Select(x => x.QuestionId)
            .FirstOrDefault();

        nextQuestion = (from t in m_dbSession.Query<QuestionDb>()
                        where t.Id == leastAnsweredId
                        select t).ToList().FirstOrDefault();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2021-02-03 06:06:59

因此,将LINQ查询编写为SQL:

代码语言:javascript
运行
复制
var grouped = 
   from t in m_dbSession.Query<AnsweredQuestionDb>()
   group t by t.Question.Id into g
   select new 
   {
      QuestionId = g.Key,
      Count = g.Count()
   };

var leastAnsweredId = grouped
   .OrderBy(x => x.Count)
   .Select(x => x.QuestionId)
   .FirstOrDefault();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66017342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档