C# 推广LINQ模型

C# 推广LINQ模型,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我在MVC模式中的模型设计上有问题,我被C#的静态类型所困扰 我想做的只是创建一组类,这些类执行所有数据库插入、更新和删除操作。该组由从数据库中的每个表映射的类的子组和访问表类的表模型类的子组组成 我正在使用LINQ映射创建表类: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Linq.Mapping; using Iris.Libra

我在MVC模式中的模型设计上有问题,我被C#的静态类型所困扰

我想做的只是创建一组类,这些类执行所有数据库插入、更新和删除操作。该组由从数据库中的每个表映射的类的子组和访问表类的表模型类的子组组成

我正在使用LINQ映射创建表类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Data.Linq.Mapping;
using Iris.Libraries;

namespace Iris.Models.Tables
{
    [Table]
    public class Users
    {
        [Column(IsPrimaryKey = true)]
        public string User_Id;

        [Column]
        public string Name;

        [Column]
        public string Password;

        [Column]
        public int Userlevel_Id;

        public Users()
        {
        }
    }
}
然后由模型类访问该表:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Data.Linq;
using Iris.Models.Tables;
using Iris.Models.DataContexts;

namespace Iris.Models
{
    public class UserModel
    {
        private UserDataContext dataContext;
        private Table<Users> users;

        public UserModel()
        {
            this.dataContext = new UserDataContext(Config.CONNECTION_STRING);

            this.users = this.dataContext.GetTable<Users>();
        }

        public List<Users> Select()
        {
            var data = from user in this.users select user;

            return data.ToList<Users>();
        }

        public Users Select(object id)
        {
            var data = from user in this.users where user.User_Id.ToString() == id.ToString() select user;

            return data.ToList<Users>()[0];
        }

        public void Insert (Users user)
        {
            this.dataContext.Users.InsertOnSubmit(user);

            this.dataContext.SubmitChanges();
        }

        public void Update(Users user)
        {
            var queryableData = from row in this.dataContext.Users where row.User_Id == user.User_Id select row;

            var editedData = queryableData.Single<Users>();

            editedData.User_Id = user.User_Id;
            editedData.Name = user.Name;
            editedData.Password = user.Password;
            editedData.Userlevel_Id = user.Userlevel_Id;

            this.dataContext.SubmitChanges();
        }

        public void Delete(Users user)
        {
            var queryableData = from row in this.dataContext.Users where row.User_Id == user.User_Id select row;

            var deletedData = queryableData.Single<Users>();

            this.dataContext.Users.DeleteOnSubmit(deletedData);

            this.dataContext.SubmitChanges();
        }
    }
}
问题来自于

private Table<Users> users;
私有表用户;
表中的类对于每个表总是不同的。我已经搜索了好几天,没有找到任何解决这个问题的答案


真的不可能像上面我的那样推广表模型吗?或者有没有其他方法可以避免重复编写相同的代码?任何人,请帮助我(

使用以下通用方法:

System.Data.Linq.Table<T> GetTable
{
        get { return _db.GetTable<T>(); }
}
System.Data.Linq.Table可获取
{
获取{return _db.GetTable();}
}
您可以使用,首先创建一个通用接口:

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Delete(T entity);
    void Update(T entity);
    IEnumerable<T> GetAll(Func<T,bool> exp);
    ....
}
公共接口i假设,其中T:class
{
无效添加(T实体);
无效删除(T实体);
无效更新(T实体);
IEnumerable GetAll(函数表达式);
....
}
那么您的通用存储库模型应该如下所示:

public class Repository<T> : IRepository<T>
    where T : class, IEntity
{
    DataContext _db;
    public Repository()
    {
        _db = new DataContext("Database Connectionstring");
        _db.DeferredLoadingEnabled = false;
    }
    System.Data.Linq.Table<T> GetTable
    {
        get { return _db.GetTable<T>(); }
    }
    public IEnumerable<T> GetAll(Func<T, bool> exp)
    {
        return GetTable.Where<T>(exp);
    }
    ...
    .
}
公共类存储库:IRepository
式中T:类,属性
{
DataContext数据库;
公共存储库()
{
_db=新数据上下文(“数据库连接字符串”);
_db.DeferredLoadingEnabled=假;
}
System.Data.Linq.Table可获取
{
获取{return _db.GetTable();}
}
公共IEnumerable GetAll(函数表达式)
{
返回GetTable.Where(exp);
}
...
.
}

使用以下通用方法:

System.Data.Linq.Table<T> GetTable
{
        get { return _db.GetTable<T>(); }
}
System.Data.Linq.Table可获取
{
获取{return _db.GetTable();}
}
您可以使用,首先创建一个通用接口:

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Delete(T entity);
    void Update(T entity);
    IEnumerable<T> GetAll(Func<T,bool> exp);
    ....
}
公共接口i假设,其中T:class
{
无效添加(T实体);
无效删除(T实体);
无效更新(T实体);
IEnumerable GetAll(函数表达式);
....
}
那么您的通用存储库模型应该如下所示:

public class Repository<T> : IRepository<T>
    where T : class, IEntity
{
    DataContext _db;
    public Repository()
    {
        _db = new DataContext("Database Connectionstring");
        _db.DeferredLoadingEnabled = false;
    }
    System.Data.Linq.Table<T> GetTable
    {
        get { return _db.GetTable<T>(); }
    }
    public IEnumerable<T> GetAll(Func<T, bool> exp)
    {
        return GetTable.Where<T>(exp);
    }
    ...
    .
}
公共类存储库:IRepository
式中T:类,属性
{
DataContext数据库;
公共存储库()
{
_db=新数据上下文(“数据库连接字符串”);
_db.DeferredLoadingEnabled=假;
}
System.Data.Linq.Table可获取
{
获取{return _db.GetTable();}
}
公共IEnumerable GetAll(函数表达式)
{
返回GetTable.Where(exp);
}
...
.
}

这种情况在我们公司发生过一次

我们选择了“最差”的方法,即为每个表编写非常相似的代码,而不尝试概括模型(基本上,我们采用了您希望避免的方法)

这种方法看起来和闻起来都很糟糕,但由于方法和属性的大量比较,调试起来和以前一样无痛。它的扩展速度也非常快,您所需要做的就是复制、粘贴和调整差异


编辑:这一选择背后的主要原因是“这是我们自己设计的数据库,在可预见的未来不会有太大变化”

这种情况曾经在我们公司发生过

我们选择了“最差”的方法,即为每个表编写非常相似的代码,而不尝试概括模型(基本上,我们采用了您希望避免的方法)

这种方法看起来和闻起来都很糟糕,但由于方法和属性的大量比较,调试起来和以前一样无痛。它的扩展速度也非常快,您所需要做的就是复制、粘贴和调整差异


编辑:这个选择背后的主要原因是“这是一个我们自己设计的数据库,在可预见的未来不会有太大变化”

也许您正在寻找。这只是DataContext方法的快捷方式,您可以向DataContext添加一些通用方法来完成同样的事情。困难在于统一界面中的主键,并将实体重新附加到DataContext以进行更新。正如@Steven所建议的,使用repo的ORM会让您更高兴sitory模式。也许您正在寻找。这只是DataContext方法的快捷方式,您可以向DataContext添加一些通用方法来完成同样的事情。困难在于统一接口中的主键,并将实体重新附加到DataContext以进行更新。正如@Steven所建议的,使用ORM usi您会更高兴正在修改存储库模式。我一直很好奇……这种方法不要求调用方知道您正在建模的数据类型,从而破坏了建模本身的目的吗?(不确定措辞,希望我的疑问是明确的)非常感谢您的帮助Mahmoud Gamal。您的解决方案适合我。我的项目中有很多模型。使用该存储库模式,我不必为每个模型编写大量重复的代码。我一直很好奇……这种方法不需要调用方知道您正在建模的数据类型吗建模本身的目的是什么?(不确定措辞,希望我的疑问是明确的)非常感谢你的帮助Mahmoud Gamal。你的解决方案对我很有用。我的项目中有很多模型。使用这种存储库模式,我不必为每个模型编写大量重复的代码。