【问题标题】:Select Contains With CSV But Keep Sort Order选择包含 CSV 但保持排序顺序
【发布时间】:2013-04-09 15:25:24
【问题描述】:

我有一个场景,我在一个名为 csv 的变量中有一个 IList<Guid>,它也是我需要保留的特定顺序。然后我正在做一个选择包含,这样我就可以根据我拥有的 guid 列表取回我的所有主题。

guid 来自 lucene 搜索,按每个 LuceneResult 的原始分数排序。这就是为什么我需要按这个顺序排列它们。

            var results = _context.Topic
                              .Where(x => csv.Contains(x.Id));

但是。我一这样做就失去了向导进来的命令。知道如何做到这一点,但保持相同的顺序,我将 guid 列表交给上下文,并根据 topid.Id 以相同的顺序返回主题?

我已经尝试了下面提到的以下方法,通过加入但它们仍然以相同的顺序出现?请注意,我也在分页这些结果。

            var results = _context.Topic
            .Join(csv,
                    topic => topic.Id,
                    guidFromCsv => guidFromCsv,
                    (topic, guidFromCsv) => new { topic, guidFromCsv }
                )
                .Where(x => x.guidFromCsv == x.topic.Id)
                .Skip((pageIndex - 1)*pageSize)
                .Take(pageSize)
                .Select(x=> x.topic);

** 更新 **

所以我已经不再只使用和 guid,而是尝试传入我的 lucene 模型,该模型具有我想要订购的 score 属性。这是我所拥有的

   public PagedList<Topic> GetTopicsByLuceneResult(int pageIndex, int pageSize, int amountToTake, List<LuceneSearchModel> luceneResults)
{
    var results = _context.Topic
        .Join(luceneResults,
                topic => topic.Id,
                luceneResult => luceneResult.Id,
                (topic, luceneResult) => new { topic, luceneResult }
            )
            .Where(x => x.luceneResult.Id == x.topic.Id)
            .OrderByDescending(x => x.luceneResult.Score)
            .Skip((pageIndex - 1) * pageSize)
            .Take(pageSize)
            .Select(x => x.topic);

    var topicResults = results.ToList();

    // Return a paged list
    return new PagedList<Topic>(topicResults, pageIndex, pageSize, topicResults.Count);
}

但是我现在收到以下错误?我正在做的事情可能吗?

无法创建“LuceneSearchModel”类型的常量值。此上下文仅支持原始类型或枚举类型。

【问题讨论】:

  • 也许这会有所帮助? stackoverflow.com/questions/8669985/…
  • @leen3o _context.Topic.Where(x => csv.Contains(x.Id)).OrderBy(x => x.Id) - 不是按照你想要的顺序吗?
  • IList&lt;Guid&gt; 中的“特定顺序”是什么?你能为 LINQ 表达式设置这个顺序吗?
  • 您的问题并不清楚(即使在更新后),csv 的顺序是什么?如果这只是像“csv.OrderBy(csv => csv)”这样的排序,那么您应该在 LINQ 查询中设置相同的排序(请参阅@voo 评论)。如果这是任意顺序(例如,csv 内容是根据用户输入构建的),那么唯一的选择是在客户端进行排序(请参阅下面 Eren Ersönmez 的回答)。
  • 我想我可能已经想通了。我将传入一个自定义对象,该对象具有 guid 和来自 lucene 搜索的分数,而不是仅仅传递一个 guid,我将按照上面的方法进行连接,然后按分数属性降序排列......理论。

标签: c# linq entity-framework linq-to-sql


【解决方案1】:

如果我正确理解了这个问题,您希望根据 csv 过滤主题,并且希望以与 csv 相同的顺序返回结果。如果是这样:

var results = csv
    .GroupJoin(_context.Topic, guid => guid, topic => topic.Id, 
        (guid, topics) => topics)
    .SelectMany(topics => topics);

需要注意的是,这会将_context.Topic 视为IEnumerable&lt;T&gt;;因此,它将从数据库中获取所有主题并在客户端而不是数据库上执行 GroupJoin。

编辑:根据下面的评论,这个答案不是你想要的。我将把答案留在这里作为文档。

【讨论】:

  • 你应该提到,这个排序将在 client 端执行。
  • 感谢您的帖子。请注意,我也在分页结果,请参阅上面的更新问题
  • 可能有 10,000 个主题,所以我无法在客户端进行。不过感谢您的评论。
猜你喜欢
  • 2012-09-05
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2020-01-25
  • 2021-04-15
  • 1970-01-01
相关资源
最近更新 更多