0

以下 2 个方法是通用存储库模式实现的一部分。

GetById 有效并返回 Id == id 的行。

GetByIdIncludingEntities 有问题。它需要与 GetById 类似地工作,并具有包括(加载)在“实体”数组中指定的相关实体行的附加功能。目前它可以工作,但它返回多行结果中的第一行。它只需要返回具有 Id == id 的行。请注意,所有实体都有一个名为“Id”的主键,它是一个整数(参见下面的实体模型)。

public virtual TEntity GetByIdIncludingEntities(int id, string[] entities)
{
    // id: The primary key value to find.
    // entities: Array of related entities to eagerly load.  i.e., “BigThings”

    var query = from q in context.Set<TEntity>() select q;

    foreach (string entity in entities)
    {
        query = query.Include(entity);
    }

    return query.SingleOrDefault();
}

public virtual TEntity GetById(int id)
{
    return context.Set<TEntity>().Find(id);
}

Here is a sample entity for reference.

[Table("Things")]
public class Thing
{
    public Thing()
    {
        this.BigThings = new HashSet<BigThing>();
        this.SmallThings = new HashSet<SmallThing>();
    }

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    [IgnoreDataMember]
    public virtual ICollection<BigThing> BigThings { get; set; }

    [IgnoreDataMember]
    public virtual ICollection<SmallThing> SmallThings { get; set; }
}
4

1 回答 1

0

好吧,如果您想按 ID 查找...不要使用

return query.SingleOrDefault();

(顺便说一句,这可能会引发异常)

利用

return query.Find(id);

顺便说一句,为了避免字符串,你可以使用

public virtual TEntity GetByIdIncludingEntities(int id, params Expression<Func<TEntity, object>> []  entities)
{
  var query = context.Set<TEntity>();
  foreach (var entity in entities)
      query = query.Include(entity);

  return query.Find(id;
}

因为 Include 有一个重载,它需要一个Expression<Func<TEntity, TValue>>as 参数(您可能必须导入正确的命名空间才能获取它)。

那么用法将是

repository.GetByIdIncludingEntities<Entity1>(id, m => m.RelatedEntity, m=> m.OtherRelatedEntity)
于 2013-07-26T15:05:25.577 回答