实体框架查询 - 以特定顺序获取对象

时间:2011-05-04 14:12:02

标签: .net linq entity-framework

我有一个List,用于指定数据库中多个对象的ID。我想从一个表中获取具有这些ID的对象集,并按照确切的顺序保存它们,并且我希望它作为对DB的一个查询执行(而不是'N'查询)。

例如,我有一个ID列表{5,3,6,9},我希望找回带有这些ID的Customer对象列表,并按顺序排列{Customer(5,'Bob') ,客户(3,'JimBo'),客户(6,'Joe'),客户(9,'Jack')}。

数据量足够小,我不介意在数据库查询后重新排序。我可以在大约15行干净的代码中完成所有这些(包括手动重新排序),但我觉得应该有一个针对EF的单行或双行LINQ查询,应该可以轻松完成。

4 个答案:

答案 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()方法。