Mic*_*uso 3 sql linq interface linq-to-sql linq-expressions
因此,我在 VS 中从现有数据库创建了一个 DataContext (Linq-Sql)。它有一个名为 Users 的表,因此我有一个User对象。我特别想关注UserID和Username属性。
现在,我有一个界面:
interface IUser
{
int Id { get; }
string Username { get; }
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个部分User类并实现IUser. 这样做的原因是,我可以在许多地方将任何 User 视为 IUser,而不必关心确切的 User 类:
public partial class User : IUser
{
public int Id
{
get { return UserID; }
}
}
Run Code Online (Sandbox Code Playgroud)
我没有实现Usernameget 属性,因为我知道实体对象已经实现了它。
当我有一个查询时,dc.Users.SingleOrDefault(p => p.Id == 5);我知道这是一个错误,因为它会将该调用转换为 SQL 语句,并且它会尝试查找Id不存在的列 - UserID 存在。所以我理解这个映射问题。
当我查询时dc.Users.SingleOrDefault(p => p.Username == "admin"),它也会抛出一个错误,但Username确实是数据库中的一个现有列,所以我的印象是不需要进行自定义/附加映射。我错过了什么?
有人能给我指出一个关于如何对抗 Linq 与部分类实现自定义接口的好资源吗?
更新问题: 在我尝试之前,有没有人知道使用我们的自定义接口(以实现类本身而不是在单独的部分类文件中)“装配” datacontext.designer.cs 文件是否可行?这样做有什么后果吗?
我在使用泛型和 LINQ 之前遇到过这个问题,我解决它的方法是更改p.Id == 5为p.Id.Equals(5)LINQ 能够映射查询。
关于装配自动生成的代码,我在我的项目中已经这样做了,唯一的烦恼是如果您重新生成 DBML 文件,则必须再次键入所有接口。我查看了向类动态添加接口的方法,并找到了这篇 SO 帖子,但我还没有尝试过:
无论哪种方式,重新输入现在对我们来说都是一个更好的权衡,因为我们已经能够使用这种方法删除我们实现代码中的大量重复。
不幸的是,我对 LINQ 或 .NET 的经验不足,无法解释为什么Equals()在==不使用时有效:)