gpt4 book ai didi

c# - 泛化 LINQ 模型

转载 作者:太空宇宙 更新时间:2023-11-03 16:33:04 25 4
gpt4 key购买 nike

我在 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();
}
}
}

上面的一对代码工作正常,没有任何问题,但我想避免一次又一次地为模型类编写“几乎相同”的代码,因为数据库中有很多表。为了实现这个目的,我尝试制作一个通用的模型类和从它扩展的每个表模型。

public class Users : Model {}

问题出处

private Table<Users> users;

哪个是 Table<> 中的类,每个表总是不同的。我已经搜索了几天,但没有找到解决此问题的任何答案。

像我上面的表格模型真的不可能泛化吗?或者有什么其他方法可以避免重复编写相同的代码?任何人,请帮助我.. :(

最佳答案

使用以下通用方法:

System.Data.Linq.Table<T> GetTable
{
get { return _db.GetTable<T>(); }
}

您可以使用 Repository Pattern ,首先创建一个通用接口(interface):

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);
....
}

那么您的通用存储库模型应如下所示:

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);
}
...
.
}

关于c# - 泛化 LINQ 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10173657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com