我有一个方法如下。它返回MyTypes
列表,默认情况下,myType.Id
按升序显示。我希望这个列表按照我传递给方法的ids
参数进行排序。
public List<MyType> GetMyTypes(List<int> ids)
{
return (from myType in db.MyTypes
where ids.Contains(myType.Id)
select new MyType
{
MyValue = myType.MyValue
}).ToList();
}
所以如果ids
包含
302
300个
301
返回的List按升序包含项目。
按List<MyType>
的顺序返回ids
需要做什么?
由于
修改:我已尝试orderby ids.IndexOf(myType.Id)
,但会抛出异常Method 'Int32 IndexOf(Int32)' has no supported translation to SQL.
答案 0 :(得分:7)
public static List<MyType> GetMyTypes(List<int> ids)
{
int index = 0;
Dictionary<int, int> positions = ids.ToDictionary(c => c, c => index++);
MyType[] results = new MyType[ids.Count];
foreach (MyType aType in (from myType in db.MyTypes
where ids.Contains(myType.Id)
orderby myType.Id
select myType))
{
results[positions[aType.Id]] = aType;
}
return results.ToList();
}
这不会搜索db.MyTypes中每个元素的id列表(这是一件好事:它会很快!)。
我的原始(不正确)答案:
使用orderby子句。
public List<MyType> GetMyTypes(List<int> ids)
{
return (from myType in db.MyTypes
where ids.Contains(myType.Id)
orderby myType.Id
select new MyType
{
MyValue = myType.MyValue
}).ToList();
}
目前还不清楚db.MyTypes返回什么类型的对象,但是,在猜测时,可以通过避免更新更多MyType对象来简化代码。
public List<MyType> GetMyTypes(List<int> ids)
{
return (from myType in db.MyTypes
where ids.Contains(myType.Id)
orderby myType.Id
select myType).ToList();
}
答案 1 :(得分:5)
Daniel几乎是对的,但使用传入列表顺序的简单方法是按该列表中ID的索引排序:
public List<MyType> GetMyTypes(List<int> ids)
{
return (from myType in db.MyTypes
where ids.Contains(myType.Id)
orderby ids.IndexOf(myType.Id)
select myType).ToList();
}
注意我不知道这是否适用于SQL查询,因此这可能只是Linq-to-objects。使用大量的ID列表也可能效率很低。
答案 2 :(得分:4)
以下工作:
public List<MyType> GetMyTypes(List<int> ids)
{
var unordered = (from myType in db.MyTypes
where ids.Contains(myType.Id)
select new MyType
{
MyValue = myType.MyValue
}).ToList();
var ordered = (from uo in unordered
orderby ids.IndexOf(uo.Id)
select uo).ToList();
return ordered;
}