我有一个List,用于指定数据库中多个对象的ID。我想从一个表中获取具有这些ID的对象集,并按照确切的顺序保存它们,并且我希望它作为对DB的一个查询执行(而不是'N'查询)。
例如,我有一个ID列表{5,3,6,9},我希望找回带有这些ID的Customer对象列表,并按顺序排列{Customer(5,'Bob') ,客户(3,'JimBo'),客户(6,'Joe'),客户(9,'Jack')}。
数据量足够小,我不介意在数据库查询后重新排序。我可以在大约15行干净的代码中完成所有这些(包括手动重新排序),但我觉得应该有一个针对EF的单行或双行LINQ查询,应该可以轻松完成。
答案 0 :(得分:3)
我相信您需要在获得结果后执行订购。我可能会像这样解决它。
var efQuery = /* your query here */.AsEnumerable(); // force evaluation
var orderedResult = from id in idList // { 5, 3, 6, 9 }
join item in efQuery
on id equals item.Id
select item;
查询结果的ID列表的内存中连接将保留ID的排序。
编辑来自评论
我的蜘蛛般的感觉刺激使用加入 依靠维护排序 订购。我想知道这是不是说明了 加入文档的属性(如果 不会在未来改变 .NET的版本,例如for 表现原因)。
我指向http://msdn.microsoft.com/en-us/library/bb534675.aspx,备注部分
加入保留的顺序 外部的元素,以及每个的元素 这些元素,顺序 匹配内在的元素。
答案 1 :(得分:3)
我不认为整个事情可以在一个查询中完成,但在两个查询中很容易做到。一个在DB上,一个在内存中。
第一个查询将仅选择具有指定ID的客户:
var customers = (from c in context.Customers
where itemIds.Contains(c.Id)
select c).AsEnumerable();
第二个会根据你的清单订购它们:
var customers = from id in itemIds
join c in customers
on id equals c.Id
select c;
var customersList = customers.ToList();
答案 2 :(得分:0)
显然,您可以获得一个对象列表,其中ID列表包含足够容易搜索的ID。至于orderby,我无法根据单个查询中的ID列表来考虑这样做。但是,如果您有一种逻辑方式来指定原始ID的排序方式(如果不是随机的),那么您可以创建一个相等比较器函数,如图所示here
答案 3 :(得分:-1)
void Main()
{
List<Data> data = new List<Data>();
data.Add(new Data{Id =1, Name = "ABC1"});
data.Add(new Data{Id =2, Name = "ABC2"});
data.Add(new Data{Id =3, Name = "ABC3"});
data.Add(new Data{Id =4, Name = "ABC4"});
data.Add(new Data{Id =5, Name = "ABC5"});
var result = from d in data
let ids = new List<int>{3,4,5}
where ids.Any(i=> i == d.Id)
select d;
result.Dump();
}
// Define other methods and classes here
class Data
{
public int Id{get;set;}
public string Name{get;set;}
}
ids可能是另一个从其他地方获取ID的查询,但可以根据需要订购它们。请注意,这是一个Linqpad代码,因此.Dump()方法。