【发布时间】: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<Guid>中的“特定顺序”是什么?你能为 LINQ 表达式设置这个顺序吗? -
您的问题并不清楚(即使在更新后),
csv的顺序是什么?如果这只是像“csv.OrderBy(csv => csv)”这样的排序,那么您应该在 LINQ 查询中设置相同的排序(请参阅@voo 评论)。如果这是任意顺序(例如,csv内容是根据用户输入构建的),那么唯一的选择是在客户端进行排序(请参阅下面 Eren Ersönmez 的回答)。 -
我想我可能已经想通了。我将传入一个自定义对象,该对象具有 guid 和来自 lucene 搜索的分数,而不是仅仅传递一个 guid,我将按照上面的方法进行连接,然后按分数属性降序排列......理论。
标签: c# linq entity-framework linq-to-sql