Linq to sql 如何将工厂类与LINQforSQL一起使用?

Linq to sql 如何将工厂类与LINQforSQL一起使用?,linq-to-sql,factory-pattern,factory-method,Linq To Sql,Factory Pattern,Factory Method,我在数据库模型之上有一个模型,并映射存储库中的对象 然而,很明显,无论我是直接在GetUsers中“选择new”还是下面实现的“select factoryresult”,都会产生不同。我在运行时得到一个错误,即CreateFromDbModel方法没有到sql的转换(System.NotSupportedException) 有办法解决这个问题吗?我能修一下吗 想要使用工厂方法的原因是,我可能会在其他地方实例化对象,并希望将“映射代码”保留在一个地方 谢谢你的评论, 安德斯 public IQ

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

然而,很明显,无论我是直接在GetUsers中“选择new”还是下面实现的“select factoryresult”,都会产生不同。我在运行时得到一个错误,即CreateFromDbModel方法没有到sql的转换(System.NotSupportedException)

有办法解决这个问题吗?我能修一下吗

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

谢谢你的评论, 安德斯

public IQueryable GetUsers(bool includeTeams)
{
从u in_db.sc_玩家返回
其中(包括团队| |(!u.aspnet_User.sc_Player.IsTeam))
选择UserFactory2.CreateFromDbModel(u);
}
公共静态用户CreateFromDbModel(sc_播放器)
{
返回新用户
{
Id=player.sc\u PlayerID,
FirstName=player.FirstName.Trim(),
LastName=player.LastName.Trim(),
PresentationName=player.FirstName.Trim()+“”+player.LastName.Trim(),
LoginName=player.aspnet\u User.LoweredUserName,
IsTeam=player.IsTeam,
Email=player.aspnet\u User.aspnet\u Membership.Email,
Password=player.aspnet\u User.aspnet\u 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();
}
希望这是有意义的。
道格拉斯H.

这个错误几乎可以解释这一切

“CreateFromDbModel方法没有到sql的转换(System.NotSupportedException)”


CreateFromDbModel方法不是sql函数。在从服务器专门返回对象之前,应用程序将无法运行CreateFromDbModel函数。在对查询运行CreateFromDbModel之前,您很可能需要在查询中调用ToList()或类似的函数。

感谢Douglas和RossiDead,在调用factory方法之前,我已尝试转换为list,但我不仅必须从数据库返回所有linq对象,我还必须构造我所有的域模型对象——我试图找到一种不需要这些的方法。。。此外,我在我的服务层中进行过滤,并且必须将列表转换回可查询状态……嗨,道格拉斯,我将您的回复标记为答案,但我希望将数据库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();
}
IQueryable<User> query = GetUsers(true);

var q = from u in query
    where u.Name.Contains("Bob")
    select new {Name = u.FirstName + " " + u.LastName};
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.