EntityFramework:当映射列类型为文本时,OrderBy()数字属性

时间:2016-12-12 09:03:54

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

 return JsonConvert.SerializeObject(new Entities()
   .Student_Master
   .Where(k => k.Student_Location == Location && k.Student_Course == Program)
   .OrderBy(i => i.Student_Batch)
   .Select(i => i.Student_Batch)
   .Distinct()
   .ToList());

输出:

 [23,24,28,25,30,26,27,29]

需要输出

 [23,24,25,26,27,28,29,30]

我尝试使用OrderBy(i => i.Student_Batch)但数据库Student_Batch数据类型为string,因此无法正确排序

我试过跟随

  var data=new Entities().Student_Master.Where(k => k.Student_Location == Location && k.Student_Course == Program).OrderBy(i => i.Student_Batch).Select(i => i.Student_Batch).Distinct().ToList();
 foreach(var obj in data)
   {
     //converted string to int then store in array 
   }

有简单的方法吗?

3 个答案:

答案 0 :(得分:1)

.Distinct()删除任何.OrderBy()子句,因为根据定义,Distinct()(或SQL中的DISTINCT)返回一组无序的不同值。您需要在.OrderBy()电话后链接.Distinct()来电。

当您想要按数值对它们进行排序时,将值作为字符串确实会产生问题。如果您无法更改数据库架构,则可以使用this method将值投影到整数,然后执行.Distinct().OrderBy()

最后,您应该在使用Entities对象后正确处置它,以关闭数据库连接,最好将其封装在using指令中。

答案 1 :(得分:1)

好的,因为问题在于排序。你有几个选择,我将展示其中2个。首先,您可以使用sudo ./certbot-auto certonly --standalone -d mydomain.com -d www.mydomain.com ,这很常见:

Array.Sort()

第二种常见方法是创建自定义比较器并在string[] values = new Entities() .Student_Master .Where(k => k.Student_Location == Location && k.Student_Course == Program).Select(i => i.Student_Batch) .Distinct().ToArray(); Array.Sort(values); // all you need. 内使用它:

OrderBy

答案 2 :(得分:0)

由于Linq2Entities不支持从字符串转换为int(既不使用int.Parse也不使用Convert.ToInt32),您必须使用IQueryAbleIEnumerable转换为AsEnumerable 。当然这是性能方面的噩梦,但是由于SQL无法通过即时转换对字符串进行整数运算,这就是你所需要的。

顺便说一句:使用ToArrayToList也会枚举该集合并将其放入内存中。