如何在LINQ Query where子句中指定文字字段名称?

时间:2013-07-26 15:01:44

标签: linq entity-framework generics repository-pattern

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

GetById工作并返回Id == id。

的行

GetByIdIncludingEntities有问题。它需要与GetById类似地工作,其附加功能包括(加载)“entities”数组中指定的相关实体行。目前它可以工作,但它返回多行结果中的第一行。它只需要返回具有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; }
}

1 个答案:

答案 0 :(得分: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>>作为参数(你可能需要导入正确的命名空间才能得到它)。

然后使用

repository.GetByIdIncludingEntities<Entity1>(id, m => m.RelatedEntity, m=> m.OtherRelatedEntity)