Linq-to-Entities:我的OrderBy子句不是排序

时间:2015-03-20 11:51:21

标签: c# linq entity-framework linq-to-sql linq-to-entities

我有一个Linq语句,它使用流利和点符号的混合来订购,分组,再次订购,然后对某些实体执行Skip / Take

(from terms in db.stt_term
 where !terms.deleted && languageIDs.Contains(terms.language_id)
 join concepts in db.stt_concept
    on terms.concept_id equals concepts.id
 where !concepts.deleted && concepts.dictionary_id == dictionaryID
 select terms).GroupBy(t => t.concept_id)
              .Select(grp => new
                                 {
                                     ConceptId = grp.Key,
                                     // the order of the Terms in each grouping should be dictated by the order of the Languages
                                     Terms = grp.OrderBy(t => SqlFunctions.CharIndex(strLangIDs, "_" + t.language_id + "_"))
                                 })
              // now order all the groups by the first term in each
              .OrderBy(grp => grp.Terms.FirstOrDefault().term_translation)
              .Skip(page*conceptsPerPage)
              .Take(conceptsPerPage)

好的,如果没有任何背景解释,这可能有点太多了,但我想提请你注意这一行

Terms = grp.OrderBy(t => SqlFunctions.CharIndex(strLangIDs, "_" + t.language_id + "_"))

这是我尝试获得IndexOf之类的功能。我已经使用了这个,因为Linq-to-Entities不识别IndexOf调用,而我能找到的最接近的函数是为linq-to-SQL提供的函数中的CharIndex

CharIndex显然需要一个字符串,而我真正想要做的是订单term实体,根据它们的.language_id属性在整数数组中的索引位置。因此,为了解决没有可用的IndexOf,我已将整数数组转换为_ - 分隔的字符串,然后搜索相应格式的language_id

例如,数组{15, 1, 3, 4}变为"_15_1_3_4_",然后我在此字符串中找到了"_3_"的索引。然后应在language_id = 15以上的条款下订购lanaguage_id = 1的条款。

然而,结果表明没有订购。

如果我将OrderBy语句转换为

Terms = grp.OrderBy(t => t.language_id))

然后订购 。但是,当我使用SqlFunctions.CharIndex时,对我进行轻微的黑客调用时,不会进行任何排序。

有人可以解释为什么CharIndex没有像我期望的那样订购吗?

1 个答案:

答案 0 :(得分:1)

您正在使用目标... SqlFunctions.CharIndex

反转搜索结果
public static Nullable<int> CharIndex(
    string toSearch,
    string target
)

颠倒两个。

SqlFunctions.CharIndex(strLangIDs, "_" + t.language_id + "_")

SqlFunctions.CharIndex("_" + t.language_id + "_", strLangIDs)