如何通过LINQ查询中的函数进行排序?

时间:2017-06-05 10:13:24

标签: c# asp.net-mvc linq

我正在使用Entity Framework开发我的第一个MVC应用程序。我有一个表USERS和一个表RESTRICTIONS

在我的控制器中,我写了一个函数,它返回两个用户之间的常见限制数:

public int common_restrictions(int id1, int id2)
    {
        MyModel bd = new MyModel();
        int count= 0;

        var restrictions = from c in bd.RESTRICTIONS where c.ID_USER == id1 
        select c;
        var restrictions2 = from c in bd.RESTRICTIONS where c.ID_USER == id2 
        select c;

        foreach (var prop in restrictions)
        {
            var nr = restrictions2.Count(p => p.ID_PROP == prop.ID_PROP);
            if (nr != 0)
            {
                count++;
            }
        }
        return count;
    }

该功能按预期工作。 现在在同一控制器中的另一个函数中,我想按照与特定用户的共同限制的降序对用户列表进行排序(假设用户的ID为12)。我在查询中获得了用户列表,但我不知道如何在那之后对它们进行排序

var query = from u in bd.USERS where u.ID != 12
                    select u;
// sort the list??

我试过

        var query = from u in bd.USERS orderby(common_restrictions(u.ID, 
                    12)) select u;

但是我收到以下错误消息:

  

“LINQ to Entities无法识别方法'Int32 common_restrictions(Int32,Int32)'方法,并且此方法无法转换为商店表达式。”

1 个答案:

答案 0 :(得分:0)

如果您不想在User对象中包含其他属性,则需要分两步执行此操作。我认为以下方式更容易。

      var query = (from u in bd.USERS where u.ID != 12
                select u).ToList();
      var unSorteUsers = (from u in query  
                            select new
                            {

                                User = u,
                                CR = common_restrictions(u.ID,12)
                            });

        var sortedUsers = (from u in unSorteUsers

                           orderby u.CR
                           select new User
                           {

                               ID = u.User.ID,
                               //All other properties.
                           });