【问题标题】:Order query by int from an ordered list LINQ C#从有序列表LINQ C#中按int排序查询
【发布时间】:2012-12-11 18:13:02
【问题描述】:

所以我试图通过一个 int var 对查询进行排序,该 int var 位于相同 int var 的有序列表中;例如查询必须按项目的列表顺序排序。每个数据上下文都来自不同的数据库,这就是我将第一个查询变成基于宠物名称顺序的有序 id 列表的原因,第二个查询的数据字段中只有宠物 id 可用,查询看起来像:

        using (ListDataContext syndb = new ListDataContext())
        {
            using (QueryDataContext ledb = new QueryDataContext())
            {   
                // Set the order of pets by name and make a list of the pet id's
                var stp = syndb.StoredPets.OrderBy(x => x.Name).Select(x => x.PetID).ToList();
                // Reorder the SoldPets query using the ordered list of pet id's 
                var slp = ledb.SoldPets.OrderBy(x => stp.IndexOf(x.petId)).Select(x => x);

                // do something with the query

            }
        }

第二个查询给了我一个“方法 'Int32 IndexOf(Int32)' 没有支持的 SQL 转换”。错误,有什么方法可以做我需要的吗?

【问题讨论】:

  • .Select(x => x) 什么都不做,可以省略。
  • 只要在本地进行排序,一旦数据在内存中......

标签: c# linq


【解决方案1】:

LINQ to SQL (EF) 必须将您的 LINQ 查询转换为可以针对 SQL 服务器执行的 SQL。错误想说的是,IndexOf 的 .NET 方法没有等效的 SQL。您最好从SoldPets 表中获取数据,而无需执行IndexOf 部分,然后从LINQ 到SQL (EF) 进行任何剩余的排序。

这样的事情应该可以工作:

List<StoredPet> storedPets;
List<SoldPet> soldPets;

using (ListDataContext listDataContext = new ListDataContext())
{
    using (QueryDataContext queryDataContext= new QueryDataContext())
    {   
        storedPets =
            listDataContext.StoredPets
                .OrderBy(sp => sp.Name)
                .Select(sp => sp.PetId)
                .ToList();

        soldPets =
            queryDataContext.SoldPets
                .ToList();
    }
}

List<SoldPets> orderedSoldPets =
    soldPets.OrderBy(sp => storedPets.IndexOf(sp.PetId))

注意:您的示例中PetId 的大小写发生了变化,因此您不妨查看一下。

【讨论】:

  • OP 可能需要澄清一下。 IE。最简单的方法是使用ledb.SoldPets.ToList() 执行“sold pets”查询(不进行排序),然后在内存中对 list 进行排序。
  • 干杯,添加了一个例子。
  • 感谢阿德里安的精彩解释,效果很好。如果我在订购之前点击了 .ToList() ,我会因为我的问题而回家。和紧凑版 Mipe34 一样,AlexF!
【解决方案2】:

LinqToSql 无法将您的 linq 语句转换为 SQL,因为没有等效的 IndexOf() 方法。您必须首先使用 ToList() 方法执行 linq 语句,然后在内存中进行排序。

using (ListDataContext syndb = new ListDataContext())
using (QueryDataContext ledb = new QueryDataContext())
{
    var stp = syndb.StoredPets.OrderBy(x => x.Name).Select(x => x.PetID).ToList();
    // Reorder the SoldPets query using the ordered list of pet id's 
    var slp = ledb.SoldPets.ToList().OrderBy(x => stp.IndexOf(x.petId));
}

【讨论】:

    【解决方案3】:

    如果列表大小可以接受,您可以使用它:

    using (ListDataContext syndb = new ListDataContext())
    {
        using (QueryDataContext ledb = new QueryDataContext())
        {
            var stp = syndb.StoredPets.OrderBy(x => x.Name).Select(x => x.PetID).ToList();
            var slp = ledb.SoldPets.ToList().OrderBy(x => stp.IndexOf(x.petId));
    
            // do something with the query
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 2023-04-03
      • 1970-01-01
      • 2012-12-08
      • 2021-11-24
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多