选择包含CSV但保持排序顺序

时间:2013-04-09 06:09:27

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

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

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

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

然而。一旦我这样做,我就失去了guid进来的命令。我知道如何做到这一点,但保持相同的顺序我将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模型,该模型具有我想要订购的得分属性。这就是我所拥有的

   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”类型的常量值。在此上下文中仅支持原始类型或枚举类型。

1 个答案:

答案 0 :(得分:1)

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

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

请务必注意,这会将_context.Topic视为IEnumerable<T>;因此,它将从数据库中获取所有主题并在客户端执行GroupJoin,而不是在数据库上执行。

编辑:根据下面的评论,这个答案不是你想要的。我会在这里留下答案以备文件。