0

我在我的网站中实现了一个使用Linq-To-Sql. 引擎的输出是一个列表Result
为了提高安全性和性能,我在CachedResult我的数据库中添加了一个表。它有这些列:
ID, Date, Output
WhereOutput是一个字符串,它表示一个列表,integers其中的IDs 是另一个表的。
使用该Where方法,我能够从数据库中提取这些元素。问题是他们的顺序是基于他们在表格中的顺序,而不是integers我的字符串中的顺序。
因此,我以这种方式添加了OrderBy该方法:
db.Uploads.Where(upl => W.Contains(upl.UploadID)).OrderBy(pp => W.IndexOf(pp.UploadID)); W这是integers(从数据库中提取的)的列表。
问题是它抛出了一个异常,说Linq-To-Sql translator无法将该List.IndexOf方法转换为适当的 SQL 查询。

我想知道我这样做是否正确并且有解决方案,或者我完全错了,我必须寻求另一种方式?(即制作另一个与 有关系的表CachedResults

4

1 回答 1

2

您可以在排序之前将结果实现为列表,以便它使用 Linq-To-Objects 而不是 Linq-To-Sql 进行排序:

db.Uploads
  .Where(upl => W.Contains(upl.UploadID))
  .ToList()
  .OrderBy(pp => W.IndexOf(pp.UploadID));

但是,这不是很有效。由于该IndexOf方法是 O(n) 操作,因此排序将是 O(n 2 ) 操作。

CachedResultItems另一种解决方案是为每个缓存结果的整数添加另一个表,其中包含以下字段:

ID       int
Ouptut   int
Position int

您可以在表中保存这些记录(对于表中的 ID 42 ),而不是5,7,12,26,81在表中存储字符串:CachedResultCachedResultItemsCachedResult

ID   Output  Position
---- ------- ---------
42   5       1
42   7       2
42   12      3
42   26      4
42   81      5

然后您可以连接这两个表,并对结果进行排序Position

这也比第一次获得一个结果、将字符串拆分为一个列表并在查询中使用该列表要快,因为它是一个单一的查询,并且它可以更有效地使用索引。

于 2012-07-13T21:57:47.597 回答