如何在Linq或Entity Framework中动态选择表名

时间:2015-02-03 05:32:31

标签: linq entity-framework

我想调用数据的控制器方法,因为可以从不同的表中输出多个数据,因此它取决于用户选择从哪个表中获取输出,所以我想通过单个linq获取输出根据用户选择的表名。

           query = (from Ledger in fen.TblLedgers
                     join acc in fen.Accounts
                     on Ledger.Code equals acc.AccId
                     where acc.DrCr == Fin.DRCR && Ledger.Grp == Fin.LedGrp  && acc.Vdate <= DateTime.Today && Ledger.isActive == "Y" group acc by new { acc.AccId } into g select g.Sum(acc => acc.Amt)).Sum() ; 

1 个答案:

答案 0 :(得分:0)

如果你想这样做,一种方法是使用lambdas并实现类似下面的内容。

它的长短 - 你需要利用DbContext.Set&lt; T>方法DbContext.Set method (MSDN)the generic one (MSDN)

用户选择Vary T(或类型参数),然后是lambda。

但是,为了做到这一点,所有T都需要实现相同的接口,并且在使用它们之前需要将元素强制转换为该接口。但是,如果你想要任何这些东西可以工作,你必须这样做......)

(下面的代码徒手书写,如果出现奇怪的错误,请不要抱怨!)

所以 - 使用类:

public interface IAnimal
{
    ....
}
public class Dog :IAnimal
{
    ....
}
public class Cat :IAnimal
{
    ....
}
public class Cow :IAnimal
{
    ...
}

您可以使用以下内容:

var userSelection = "Dog";
Type chosenType = chooseTypeAccordingToUserSelection(userSelection);
var animalDBSet = GetOpenDBcontext().Set(chosenType).Cast<IAnimal>();
var insects = animalDBSet.Where(a=>a.NumberOfLegs>4);

HTH!