我在数据库模型之上有一个模型,并在存储库中映射对象。

但是,无论是直接在我的GetUsers中“选择新”还是在下面实现的“select factoryresult”,这都有所不同。我在运行时收到错误消息,方法CreateFromDbModel没有转换为sql(System.NotSupportedException)。

有没有解决的办法?我可以以某种方式修复吗?

想要使用工厂方法的原因是我可能在其他地方实例化对象,并希望将“映射代码”保留在一个地方...

感谢您的任何评论,
安德斯

    public IQueryable<User> GetUsers(bool includeTeams)
    {
        return from u in _db.sc_Players
               where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam))
               select UserFactory2.CreateFromDbModel(u);
    }


    public static User CreateFromDbModel(sc_Player player)
    {
        return new User
                   {
                       Id = player.sc_PlayerID,
                       FirstName = player.FirstName.Trim(),
                       LastName = player.LastName.Trim(),
                       PresentationName = player.FirstName.Trim() + " " + player.LastName.Trim(),
                       LoginName = player.aspnet_User.LoweredUserName,
                       IsTeam = player.IsTeam,
                       Email = player.aspnet_User.aspnet_Membership.Email,
                       Password = player.aspnet_User.aspnet_Membership.Password
                   };
    }

最佳答案

是因为您要在GetUsers方法中返回IQueryable吗?请尝试返回列表。这将强制Linq查询在方法中执行。

public List<User> GetUsers(bool includeTeams)
{
    return (from u in _db.sc_Players
    where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam))
    select UserFactory2.CreateFromDbModel(u)).ToList();
}

不确定是否可以解决问题,只是预感。我能够在本地数据库上复制您在Linqpad中所做的事情,并且可以正常工作。但是我的示例没有返回IQueryable。您是否还在GetUsers()之外修改IQueryable集合?

编辑:

我已经做了一些检查。我只有在修改示例后才能复制该错误,因此在调用GetUsers()之后,在第二个Linq查询中使用了IQueryable集合:
IQueryable<User> query = GetUsers(true);

var q = from u in query
    where u.Name.Contains("Bob")
    select new {Name = u.FirstName + " " + u.LastName};

我敢打赌,如果您按照GetUsers()的建议返回列表,该错误将消失。唯一的缺点是,在调用GetUsers()之后执行的任何筛选操作都不会限制从数据库返回的数据量,因为在调用.ToList()时已经执行了查询。

编辑2:

不幸的是,我认为没有其他方法可以在查询中包含工厂方法。我还有一个主意。
您可以为IQueryable创建扩展方法,将其命名为ToUserList()。在ToUserList()内部,您可以在查询上调用ToList()并返回工厂用户的工厂方法。使用Linq完成数据筛选后,请调用此方法。这将使您仅在准备好从数据库中加载数据时才执行查询。下面给出一个例子。
public static List<Users> ToUserList(this IQueryable<User> query)
{
     return query.ToList().Select(u => UserFactory2.CreateFromDbModel(u));
}

像这样调用扩展方法:
// Filter the data using linq. When you are ready to execute the query call:
query.ToUserList(); // Query will execute and a list of User objects returned.

希望这是有道理的。
道格拉斯·H。

10-04 23:09