在WebApi项目的存储库类中,有一个方法GetSingleIncluding()
,它返回一个实体,其中包含作为参数传递的隐藏对象。
private readonly EFDbContext _context;
private IDbSet<T> _entities;
private IDbSet<T> Entities
{
get
{
_entities = _entities ?? _context.Set<T>();
return _entities;
}
}
public T GetSingleIncluding(int id, params Expression<Func<T, object>>[] includeProperties)
{
var query = Entities.Where(x => x.ID == id);
foreach (var includeProperty in includeProperties)
{
query = query.Include(includeProperty);
}
return query.First();
}
我在控制器中有一个动作
public HttpResponseMessage GetFull(int id, string entities)
我用它作为:
var entitiy = Repository.GetSingleIncluding(id, x => x.Person);
这里我明确传递了一个参数x => x.Persons
有没有办法通过url请求传递这些参数?例如,我将把所有对象(可以包含在当前实体中)作为字符串传递给URL
http://localhost/api/House/1/Person,Address,...
并且控制器将这些参数传递给GetSingleIncluding()
方法:
Repository.GetSingleIncluding(id, x => x.Person, y => y.Address);
众议院实体
public class House : BaseEntity
{
public int PersonID { get; set; }
public int HouseID { get; set; }
public int AddressID { get; set; }
...
public virtual Person Person { get; set; }
public virtual Address Address { get; set; }
}
答案 0 :(得分:1)
我同意Epic先生,我认为从网址获取“包含”并不是一个好主意。无论如何,您可以向您的方法传递一个字符串数组:
public T GetSingleIncluding(int id, string[] includeProperties)
{
var query = Entities.Where(x => x.ID == id);
if (includeProperties != null && includeProperties.Count() > 0)
{
query = query.Include(includes.First());
foreach (var include in includeProperties.Skip(1))
query = query.Include(include);
}
return query.First();
}
您需要添加“使用”:
using System.Data.Entity;
答案 1 :(得分:1)
你应该看看odata.It已经内置了添加包含的功能。看看这个link并阅读有关$ expand参数的内容。