我有一个以逗号分隔的记录ID列表:
string = "2207,117,90,2168,120,118,113,112,17"
我需要能够加载那些与他们在该字符串中的位置相关联的记录。
以下是我使用LINQ方法使用LINQ to EF获取数据的代码:
var styles = db.DataModel.Categories.Where(c => c.CategoryTypeID == 5 && c.Enabled).OrderBy(c => c.Name).ToList();
是否可以修改上述查询以按照上述记录ID列表中的顺序获取记录?
我不知道该怎么做。任何帮助/示例将不胜感激。
我使用的是LINQ方法到EF 4.0 + C#
谢谢!
答案 0 :(得分:3)
使用AsEnumerable()
后,您可以按输入数组中的索引进行排序:
var input = "2207,117,90,2168,120,118,113,112,17".Split(',');
var recordIds = Array.ConvertAll(input, int.Parse);
var styles = db.DataModel
.Categories
.Where(c => c.CategoryTypeID == 5 && c.Enabled && recordIds.Contains(c.ID))
.AsEnumerable()
.OrderBy(c => Array.IndexOf(recordIds, c.ID))
.ToList();
以上假设您要加载Category
中包含ID的所有recordIds
个对象。检索它们后,您可以通过数组中的索引对它们进行排序。
答案 1 :(得分:0)
您可以使用以逗号分隔的列表过滤器hack:
...Where(c => ("," + myString + ",").IndexOf("," + c.CatgeoryID + ",") != -1)...
使用类似的技术,您可以按相同的顺序取回它们:
...OrderBy (c => ("," + myString + ",").IndexOf("," + c.CategoryID + ","))...
答案 2 :(得分:0)
如果您不想使用Linq-to-objects
,可以执行以下操作:
int[] ids = "2207,117,90,2168,120,118,113,112,17".Split(',').Select(x => int.Parse(x)).ToArray();
var styles = from c in db.DataModel.Categories
join i in ids on c.ID equals i
where c.CategoryTypeID == 5 && c.Enabled
select x;