[英]Entity Framework/C#: multiple includes from string array?
如果要对某些实体框架选择使用Include()
方法(以避免“对象被处置”异常)。 但是Include仅接受一个字符串作为参数,这意味着仅包含一个。 要进行多个包含,您必须链接包括.Include("something").Include("something").Include("something")
但是我希望包含对象来自字符串数组。
所以我想写的是等价于.Include(array[0]).Include(array[1]).Include(array[2])...Include(array[n])
(其中'n'= array.Length-1)
当然,我事先不知道字符串数组中将包含什么。
但到目前为止,我找不到正确的语法。 谢谢您的帮助
编辑:鉴于我到目前为止的建议,我想请您对类型进行精确介绍,避免出现空值问题并进行测试。 到目前为止,似乎没有任何解决方案可行,并且我迷失了使用该类型的能力。
您可以使用params string[]
来使代码更清晰:
public static IQueryable<T> Include<T>(this IDbSet<T> dbSet, params string[] includes) where T : class
{
foreach (var include in includes)
dbSet.Include(include);
return dbSet;
}
然后您可以同时使用它:
.Include("NavProp1", "NavProp2", "NavProp3");
和:
.Include(new[] { "NavProp1", "NavProp2", "NavProp3" });
您可以始终将它们链接成一个循环:
var query = DataSource.Select(...).Where(...); // as IQueryable<T>
foreach(string include in includes)
{
query = query.Include(include);
}
return query.ToList(); // materialize
public IEnumerable<T> GetDataWithIncludes<T>(string[] includes) where T: class, new()
{
DbQuery<T> dbQuery = null;
DbSet<T> dbSet = this.Set<T>();
foreach (string include in includes)
{
dbQuery = dbSet.Include(include);
}
return dbQuery.AsEnumerable();
}
对于调查此问题的其他人,我通过结合使用@ haim770和@daryal解决方案提出了一个解决方案。 它基于string[] includes
参数扩展给定的Context DbSet asQueryble并更新局部变量并保持追加
扩展类
public static class Extensions
{
public static IQueryable<T> IncludeMany<T>(this DbSet<T> model, params string[] includes)
where T : class
{
var modelQuerable = model.AsQueryable();
foreach (var value in includes)
{
modelQuerable = modelQuerable.Include(value);
}
return modelQuerable;
}
}
履行
public async Task<TestModel> GetData(Guid id)
{
var testModel= await context.TestModel.IncludeMany(
"xx",
"yy",
"xx.zz"
).All();
return testModel;
}
我希望这可以帮助人们寻找答案,即使问题有点老了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.