gpt4 book ai didi

c# - 复杂 PK 的通用 GetById

转载 作者:行者123 更新时间:2023-11-30 14:40:05 26 4
gpt4 key购买 nike

我正在寻找一种创建通用 GetById 的方法,它将 params object[] 作为参数,知道找到键/s 字段并知道找到相关实体。

在寻找解决方案的过程中,我想到了一个返回 PK 字段定义的泛型方法和一个可以返回基于字段的实体的泛型方法。

我正在寻找可以在一个或多个字段作为主键的表中使用的东西。

编辑一个或多个字段作为主键示例 =
表客户有 (CompanyId, CustomerName, Address, CreateDate)。
Customers 的主键是 CompanyId 和 CustomerName。

我正在寻找能够处理此类表格的通用 GetById。

最佳答案

如果您不知道键中有多少成员以及它们有哪些类型,则无法获得“通用”方法。我修改了my solution for single key到多个键,但如您所见,它不是通用的 - 它使用定义键的顺序:

// Base repository class for entity with any complex key
public abstract class RepositoryBase<TEntity> where TEntity : class
{
private readonly string _entitySetName;
private readonly string[] _keyNames;

protected ObjectContext Context { get; private set; }
protected ObjectSet<TEntity> ObjectSet { get; private set; }

protected RepositoryBase(ObjectContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}

Context = context;
ObjectSet = context.CreateObjectSet<TEntity>();

// Get entity set for current entity type
var entitySet = ObjectSet.EntitySet;
// Build full name of entity set for current entity type
_entitySetName = context.DefaultContainerName + "." + entitySet.Name;
// Get name of the entity's key properties
_keyNames = entitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray();
}

public virtual TEntity GetByKey(params object[] keys)
{
if (keys.Length != _keyNames.Length)
{
throw new ArgumentException("Invalid number of key members");
}

// Merge key names and values by its order in array
var keyPairs = _keyNames.Zip(keys, (keyName, keyValue) =>
new KeyValuePair<string, object>(keyName, keyValue));

// Build entity key
var entityKey = new EntityKey(_entitySetName, keyPairs);
// Query first current state manager and if entity is not found query database!!!
return (TEntity)Context.GetObjectByKey(entityKey);
}

// Rest of repository implementation
}

关于c# - 复杂 PK 的通用 GetById,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5794902/

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