繁体   English   中英

实体框架/ C#:字符串数组包含多个?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM