我在数据库模型之上有一个模型,并在存储库中映射对象。
但是,无论是直接在我的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。