不支持接口映射,但Linq-Sql对象已经实现了属性

时间:2013-01-04 21:11:43

标签: sql linq linq-to-sql interface linq-expressions

因此,我在VS中从现有数据库创建了一个DataContext(Linq-Sql)。它有一个名为Users的表,因此我有一个User对象。特别是,我想关注UserIDUsername属性。

现在,我有一个界面:

interface IUser
{
     int Id { get; }
     string Username { get; }
}

我想创建一个部分User类并实现IUser。这样做的原因是我可以在任何地方将任何用户视为IUser,而不用担心精确的用户类:

public partial class User : IUser
{
    public int Id
    {
         get { return UserID; }
    }
}

我没有实现Username get属性,因为我知道实体对象已经实现了它。

当我有dc.Users.SingleOrDefault(p => p.Id == 5);之类的查询时,我知道这是一个错误,因为它会将该调用转换为SQL语句,并且它会尝试查找Id列,但不会存在 - UserID存在。所以我理解这个映射问题。

当我查询dc.Users.SingleOrDefault(p => p.Username == "admin")时,它也会抛出错误,但是Username确实是数据库中的现有列,所以我的印象是不需要进行自定义/附加映射。我错过了什么?

有人能指出我如何对抗Linq与部分类实现自定义界面的良好来源吗?

更新问题: 在我尝试之前,有没有人知道用我们的自定义接口“绑定”datacontext.designer.cs文件(实现类本身而不是单独的部分类文件)会起作用吗?这样做的结果是什么?

1 个答案:

答案 0 :(得分:4)

我在使用Generics和LINQ之前遇到过这种情况,我解决它的方法是将p.Id == 5更改为p.Id.Equals(5),LINQ能够映射查询。

关于绑定自动生成的代码,我已经在我的项目中完成了这个,唯一的烦恼是如果重新生成DBML文件,必须再次键入所有接口。我查看了动态地向类添加接口并发现了这个SO帖子,但我还没有尝试过:

What is the nicest way to dynamically implement an interface in C#?

无论哪种方式,重新输入对我们来说都是一个更好的权衡,因为我们已经能够使用这种方法在我们的实现代码中删除大量重复。

不幸的是,我没有足够的LINQ或.NET经验来解释当Equals()没有==时{{1}}有效的原因:)