.net 实体框架查询-按特定顺序获取对象

.net 实体框架查询-按特定顺序获取对象,.net,linq,entity-framework,.net,Linq,Entity Framework,我有一个列表,指定数据库中许多对象的ID。我想从一个表中获取一组对象,这些对象都有这些ID,并将它们保持在准确的顺序中,我希望它作为一个针对DB的查询执行(而不是“N”查询) 例如,我有一个ID列表{5,3,6,9},我想用这些ID返回一个客户对象列表,并将它们按顺序保存{Customer(5,'Bob')、Customer(3,'JimBo')、Customer(6,'Joe')、Customer(9,'Jack')} 数据量足够小,我不介意在DB查询之后重新排序。我可以用大约15行干净的代码

我有一个列表,指定数据库中许多对象的ID。我想从一个表中获取一组对象,这些对象都有这些ID,并将它们保持在准确的顺序中,我希望它作为一个针对DB的查询执行(而不是“N”查询)

例如,我有一个ID列表{5,3,6,9},我想用这些ID返回一个客户对象列表,并将它们按顺序保存{Customer(5,'Bob')、Customer(3,'JimBo')、Customer(6,'Joe')、Customer(9,'Jack')}


数据量足够小,我不介意在DB查询之后重新排序。我可以用大约15行干净的代码(包括手工重新排序)完成所有这一切,但我觉得应该有一个针对EF的一行或两行LINQ查询,这样做应该很容易。

我相信在得到结果后,您需要执行排序。我可能会这样处理它

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的顺序

编辑:来自评论

我的蜘蛛在使用Join时感到刺痛 靠维持秩序 秩序。我想知道这是否是一个明确的结论 加入文档的属性(如果有) 不,它可能在未来发生变化 .NET版本,例如 性能原因)

我指给你看,评论部分

Join保留了 外部的元素,以及每个 这些元素的顺序 内部的匹配元素


显然,您可以获得一个对象列表,其中ID列表包含正在搜索的ID。至于orderby,我想不出在单个查询中基于id列表来实现这一点。但是,如果您有一种逻辑方法来指定原始ID的排序方式(如果不是随机的),那么您可以创建一个相等比较器函数,如图所示 { 列表数据=新列表(); 添加(新数据{Id=1,Name=“ABC1”}); 添加(新数据{Id=2,Name=“ABC2”}); 添加(新数据{Id=3,Name=“ABC3”}); 添加(新数据{Id=4,Name=“ABC4”}); 添加(新数据{Id=5,Name=“ABC5”}); var结果=数据中的d 设ids=新列表{3,4,5} 其中Id.Any(i=>i==d.Id) 选择d; result.Dump(); } //在此处定义其他方法和类 类数据 { 公共int Id{get;set;} 公共字符串名称{get;set;} }
ID可以是从其他地方获取ID的另一个查询,但可以根据需要对其进行排序。请注意,这是一个Linqpad代码,因此使用.Dump()方法。

我不认为整个过程可以在一个查询中完成,但可以在两个查询中轻松完成。一个在DB上,一个在内存中

第一个查询将仅选择具有指定ID的客户:

var customers = (from c in context.Customers
                where itemIds.Contains(c.Id)
                select c).AsEnumerable();
Second将根据您的列表进行订购:

var customers = from id in itemIds 
                join c in customers 
                on id equals c.Id
                select c;

var customersList = customers.ToList();

不知道你为什么会这么说,你可以用let按你喜欢的顺序获得ID,然后加入它,以同样的顺序获得客户。这将是一个查询。额外的代码是用来测试的。谢谢。事实证明,AsEnumerable是不必要的(我用SQL Profiler检查过),尽管我也认为它是必要的。我不得不说。。。我的蜘蛛在使用Join来维持排序顺序时感到刺痛。我想知道这是否是Join-in文档的声明属性(如果不是,它可能会在将来的.NET版本中更改,例如出于性能原因)。谢谢。事实证明,AsEnumerable是不必要的(我用SQL Profiler检查过),尽管我也认为它是必要的。我不得不说。。。我的蜘蛛在使用Join来维持排序顺序时感到刺痛。我想知道这是否是Join-in文档的一个声明属性(如果不是,它可能会在将来的.NET版本中更改,例如出于性能原因)。@pbarranis,请放心。我更新了答案,以解决订购文档的问题。
var customers = from id in itemIds 
                join c in customers 
                on id equals c.Id
                select c;

var customersList = customers.ToList();