从有序列表中按顺序查询LINQ C#

时间:2012-12-11 09:04:13

标签: c# linq

所以我试图通过相同int变量的有序列表中的int var来命令查询;例如查询必须按项目的列表顺序排序。每个datacontext来自不同的数据库,这就是我根据宠物名称顺序将第一个查询转换为id的有序列表的原因,只有pet 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转换。“错误,有办法做我需要的吗?

3 个答案:

答案 0 :(得分:2)

LINQ to SQL(EF)必须将您的LINQ查询转换为可以针对SQL服务器执行的SQL。该错误试图说的是IndexOf的.NET方法没有SQL等价物。您可能最好从SoldPets表中获取数据而不执行IndexOf部分,然后从LINQ to 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更改大写,因此您可能希望查看该内容。

答案 1 :(得分:1)

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));
}

答案 2 :(得分:1)

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

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
    }
}