我在我的数据库模型的顶部上的模型和对象在我的库映射。

然而,显然它有差别我是否在我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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top