gpt4 book ai didi

c# - 使用 Linq to SQL 简化创建数组列

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:22 26 4
gpt4 key购买 nike

我需要用未知大小的字符串、整数或其他数组创建 SQL 表。最好的方法是为它创建单独的表。像这样(伪代码如下,我不知道我是否正确使用“主键”):

public class DataBase : DataContext
{
public Table<UserAccount> users { get { return GetTable<UserAccount>(); } }
public Table<UserAccount_roles> userroles { get { return GetTable<UserAccount_roles>(); } }
}

[Table]
public class UserAccount
{
[Column(IsPrimaryKey = true)]
public string username;
[Column]
public string password;
}

[Table]
public class UserAccount_roles
{
[Column(IsPrimaryKey = true)]
public string userName;
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int roleIdx;
[Column]
public int arrayValue;
}

但是,如果我不担心 SQL 实现,这感觉很笨拙,因为 UserAccount_roles 可能只是 UserAccount 类中的简单“List<> 角色”。

我宁愿做这样的事情:

public class DataBase : DataContext
{
public Table<UserAccount> users { get { return GetTable<UserAccount>(); } }
}

[Table]
public class UserAccount
{
[Column(IsPrimaryKey = true)]
public string username;
[Column]
public string password;
[MyColumn]
public MySQLList<DataBase, int> roles;
}

我想做“class MySQLList<B, T> : List<T>”。在数据库类(“B”)中,我制作了一些静态方法来授予对正确数据库的访问权限。然后在 MySQLList 中,我通过重载的 List<> 方法操作数据库。这应该导致“在幕后”构建和访问表 UserAccount_roles,因为程序员(主要是我)看到的只是自定义列表 <> 上表单的简化解决方案。

我的实际问题是:

  1. 我打赌有一些现成的实现。我可以在哪里找到一个?
  2. 我想我不能做任何“[table] 类 MyTable”-MySQLList<> 中的声明。我是否必须在那里进行实际的 SQL 语言编码,或者是否有任何方法可以创建 Linq to SQL 类和在编译/运行时属性的东西?
  3. 对这种方法有任何一般注意事项吗?-)

最佳答案

如果你想避免显式声明联结表,Entity Framework可能对你更好。它将允许您直接创建多对多关系,而无需中间类型。

延伸阅读


推荐的方法是在 Linq-To-SQL 中创建具有多对多关系的两个表:

[Table]
public class UserAccount
{
[Column(IsPrimaryKey = true)]
public string username;
[Column]
public string password;

private EntitySet<UserRole> _userRole;

[Association(Storage = "_userRole", OtherKey = "userName")]
public EntitySet<UserRole> UserRoles
{
get { return this._userRole; }
set { this._userRole.Assign(value); }
}
}

[Table]
public class Role
{
[Column(IsPrimaryKey = true)]
public int roleId;
[Column]
public string roleName;

private EntitySet<UserRole> _userRole;

[Association(Storage = "_userRole", OtherKey = "roleId")]
public EntitySet<UserRole> UserRoles
{
get { return this._userRole; }
set { this._userRole.Assign(value); }
}
}

[Table]
public class UserRole
{
[Column(IsPrimaryKey = true)]
public int roleId;
[Column(IsPrimaryKey = true)]
public string userName;

private EntityRef<Role> _role;

[Association(Storage = "_role", ThisKey = "userName")]
public EntitySet<Role> Role
{
get { return this._role.Entity; }
set { this._role.Assign(value); }
}

private EntityRef<UserAccount> _userAccount;

[Association(Storage = "_userAccount", ThisKey = "userName")]
public EntitySet<UserRole> UserAccount
{
get { return this._userAccount.Entity; }
set { this._userAccount.Assign(value); }
}
}

这比拥有必须在 C# 中解析和处理的序列化整数数组要好。您可以轻松地执行以下操作:

var userRoleIds = myUser.UserRoles.Select(ur => ur.roleId);

但您还可以做更多使用序列化数组不可能做到的事情。

延伸阅读


如果您真的想将数组存储在单个列中,恐怕在 Linq-to-SQL 中没有执行此操作的标准方法(可能某些第三方提供商会支持它)。最好的办法是自己进行序列化,如下所示:

[Table]
public class UserAccount
{
...
[Column]
private string rawRoles;

public IEnumerable<int> Roles
{
get
{
return (this.rawRoles == null)
? return new int[0] :
: this.rawRoles.Split(",").Select(s => int.Parse(s));
}
set
{
this.rawRoles = (value == null)
? null
: String.Join(",", value);
}
}
}

当然,还有更好的序列化数据的方法,这只是一个例子。您不能在任何 Linq-to-SQL 查询中使用它,而且它的数据库设计非常糟糕 - 但是嘿,至少它满足了您的要求。

关于c# - 使用 Linq to SQL 简化创建数组列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15860577/

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