1

所以我试图通过一个 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 转换”。错误,有没有办法做我需要的?

4

3 回答 3

2

LINQ to SQL (EF) 必须将您的 LINQ 查询转换为可以针对 SQL 服务器执行的 SQL。错误想说的是,.NET 方法IndexOf没有等效的 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,因此您可能希望查看它。

于 2012-12-11T09:08:16.603 回答
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));
}
于 2012-12-11T09:39:11.327 回答
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
    }
}
于 2012-12-11T09:41:12.610 回答