【问题标题】:Using a string to access a table through DbContext使用字符串通过 DbContext 访问表
【发布时间】:2016-09-16 07:20:33
【问题描述】:

我想在 LINQ 查询中传递一个字符串。

string TableName = "db.Countries";

var ActualData = (from n in TableName
                          where n.Record_Instance >= 0
                          select n).OrderBy(primaryColumn);

我的目标是;我想将查询放在一个方法中,并在需要时调用它。基本上是更改 TableName 并将其作为函数调用的参数传递。

有没有办法做到这一点?

更新:
解决方法:

 var TableName = db.Countries;
       GetConditionaldata(TableName,..);

   private object GetConditionaldata( DbSet<Country> TableName, ..)
    {
        var ConditionalData = (from n in TableName
                               where n.Record_Instance >= 0
                               select n).OrderBy(primaryColumn);

        var count = ConditionalData.Count();
        var countries = ConditionalData.Skip(jtStartIndex).Take(jtPageSize);
        return countries;
    }

但在这里,我想再次指定DbSet&lt;Country&gt; 作为参数类型。如果我至少能找到一种方法来获得一个通用 Dbset,我可以将它作为我的 tableName 的参数类型传递,那么我的问题就会得到解决。

【问题讨论】:

  • 那么您是否也希望 Where 子句也是动态的?
  • 请参考以下链接:stackoverflow.com/questions/3280422/…
  • @sachin 我确实需要。
  • @vishalprajapati 这不是我要找的。​​span>
  • 嗯,你可以使用 raw sql 查询和静态部分并在其中动态替换表名。 C# 中的泛型只能用于编译时已知的类型。我们可以使用反射通过字符串名称动态查找类型,但那又如何呢?我们仍然不能将其用作&lt;T&gt; 参数。

标签: c# entity-framework linq


【解决方案1】:

假设你有多个实体包含相同的属性,你想执行相同的查询,那么你可以引入一个接口:

public interface IInstanceRecord
{
    int Record_Instance { get; set; }
}

然后将其应用于部分类中的实体(或者如果使用 Code First,则直接应用):

public partial class Country : IInstanceRecord { }
public partial class Foo : IInstanceRecord { }
public partial class Bar : IInstanceRecord { }

现在您可以使您的方法成为泛型,并添加一个约束,它所操作的泛型类型必须实现IInstanceRecord

public IQueryable<T> GetConditionalData<T>(IQueryable<T> dbSet, ...)
    where T : IInstanceRecord
{
    var conditionalData = (from n in dbSet
                           where n.Record_Instance >= 0
                           select n).OrderBy(primaryColumn);

    var count = conditionalData.Count();

    var filteredData = conditionalData.Skip(jtStartIndex).Take(jtPageSize);
    return filteredData;
}

然后用你想要的任何DbSet&lt;T&gt;(或其他IQueryable&lt;T&gt;)调用它,只要T : IInstanceRecord

var filteredCountries = GetConditionalData(dbContext.Countries);
var filteredFoos = GetConditionalData(dbContext.Foos); 
var filteredBars = GetConditionalData(dbContext.Bars);

【讨论】:

  • 啊..!!已经做了。很抱歉之前没有提供详细信息。我已经为记录实例{ISyncInstance} 实现了接口的所有实体类。我想要的是我有不同的实体类,每个类都有不同的属性。现在我正在对所有这些实体执行查询。我想为我正在执行的 3 种不同类型的查询创建方法,并在需要时调用该方法。 - 我现有的代码设计非常冗长和凌乱,但工作正常,只是想修改它。
  • 您可以在那里应用相同的模式。同样,如果您想要静态类型的查询,您需要在编译时提供类型信息。没有办法解决它。
  • 这就是我想知道的。谢谢:)
  • 这解决了我的问题:我刚刚创建了一个带有空值类型 Dbset 的 var。要将通用 Dbset 作为参数传递,您只需传递一个具有 Dbset 类型的空 var。 var TableName = (Dbset)null;表名 =db.Countries; GetConditionaldata(TableName,..);私人对象GetConditionaldata(DbSet TableName,..){返回国家; }
猜你喜欢
  • 2018-10-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2013-11-08
相关资源
最近更新 更多