使用LINQ以自定义/预定义顺序从EF数据模型加载记录

时间:2012-03-28 19:16:10

标签: linq entity-framework linq-to-entities

我有一个以逗号分隔的记录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#

谢谢!

3 个答案:

答案 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;