如何使用工厂类使用LINQ用于SQL?
-
21-09-2019 - |
题
我在我的数据库模型的顶部上的模型和对象在我的库映射。
然而,显然它有差别我是否在我GetUsers“选择新的”直接或“选择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。你furthur对矫正的IQueryable的集合外GetUsers的()?
修改强>
我已经做了一些检查。我能够只复制错误,当我修改样本所以IQueryable的收集是在第二Linq查询使用主叫GetUsers()后:
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.
希望这是很有意义的。 道格拉斯小时。
其他提示
在误差几乎可以解释这一切。
“方法CreateFromDbModel不具有转换为SQL(System.NotSupportedException)”
您CreateFromDbModel方法没有SQL函数。您的应用程序将无法运行CreateFromDbModel功能,直到对象是专门从服务器返回给你。你将最有可能调用ToList()或类似的东西在您的查询之前,你可以在上面运行CreateFromDbModel。