在数据库中未使用属性的动态OrderBy()引发异常 - c#

我有以下型号:

public class User
{
    public string UserId { get; set; }
    public string UserName { get; set; }
    public List<Membership> Membership { get; set; }
    public bool IsRegistered
    {
        get { return !String.IsNullOrEmpty(UserName); }
    }
}

public class Membership
{
    public string MembershipId { get; set; }
    public User User { get; set; }
}

在我的Membership实体存储库中,我尝试通过以下操作对集合进行排序,其中entriesIQueryable<Membership>,而orderBy是等于{ x => x.User.IsRegistered }的LamdaExpression:

ordered = Queryable.OrderBy(ordered, orderBy);

尝试执行此操作时,出现以下错误:

LINQ不支持指定的类型成员“ IsRegistered”
实体。仅初始化器,实体成员和实体导航
支持属性。

如何通过不在数据库中的属性对集合进行排序?

提前致谢。

参考方案

由于IsRegistered是客户端功能,因此您需要对对象使用LINQ进行排序。您可以通过枚举将基于SQL的LINQ转换为基于对象的LINQ。然后,一旦它成为对象上的LINQ,您就可以使用对象上的LINQ来对对象的OrderBy进行排序。常用的方法是调用ToList,例如:

ordered = Queryable.ToList().OrderBy(ordered, orderBy);

如果要对数据库进行排序,则需要将客户端代码转换为与SQL兼容的代码,例如:

ordered = Queryable.OrderBy(ordered, (x=>x.User.UserName!=null && x.User.UserName!=''));

Java中的OrderByDecending(LINQ)等效项 - java

嗨,我是一名使用Java的C#开发人员。问题很简单:我如何才能将下面的c#代码写入Java并仍能正常工作:myCoffeeList.OrderByDescending(x => x.Name?.ToLower()?.Trim() == sender.Text.ToLower()?.Trim())); 我的sender.Text基本上是一个文本框。文本的…

使用Entity Framework Core(2.1)调用标量函数的最佳实践 - c#

我经常需要从Web应用程序(ASP.NET Core / EF Core)中调用在SQL Server上定义的标量函数。由于这些函数只是简单的辅助函数,因此我也使用了许多辅助函数,因此我使用了通用模式来调用这些标量函数-借助EF Core 2.1可用的新查询类型。由于我是EF Core的新手,所以我的问题是这种模式是否会引起问题,并且/或者是否存在调用标量函…

LINQ RemoveAll代替循环 - c#

我有两个for循环,用于从列表中删除项目。我正在为这些循环寻找等效的LINQ语句for (Int32 i = points.Count - 1; i >= 0; i--) { for (Int32 j = touchingRects.Count - 1; j >= 0; j--) { if (touchingRects[j].HitTest(po…

Play Framework 2中的系统类加载器 - java

我使用的是Play 2.2.2,我有一个外部jar,它试图从同一jar的根目录加载XML资源。它使用System.class.getClassLoader().getResource("/Blabla.xml")这样做。这失败了,因为显然Play拥有一个奇怪的类加载器层次结构:ReloadableClassLoader和几个父级。该层次结…

如何以编程方式将ListView滚动到最后一个元素-Compact Framework - c#

我正在使用Windows Mobile 6.1上的3.5 Compact Framework开发应用程序。我有一个ListView,添加项目时想自动滚动此列表。我能怎么做? 参考方案 listView.EnsureVisible(listView.Items.Count - 1);