c# – 需要在运行时强制转换IQueryable

我做了我的研究,但我仍然无法找到解决这个问题的方法.我有一个程序使用lambda表达式与
linq到SQL.我想将主
linq对象实例化为动态对象,并将其在程序的其余部分中转换为基于指定值的不同类型.例如:

int Value1 = 'Ob1';
int Value2 = 'OB2';

int Currentval = Value1;

dynamic val;

if (Currentval == Value1;
        val = (from c in datacontext.UniqueTable1
               select c);
else
        val = (from c in datacontext.UniqueTable2
               select c);


dynamic val1;

if (Currentval == Value1)
{
  val1 = ((IQueryable<datacontex.UniqueTable1>)val).Where(c => c.ID == 2);
}
else if (Currentval == Value1)
{
  val1 = ((IQueryable<datacontex.UniqueTable2>val).Where(c => c.ID == 3);
}

你不能做我上面提到的,因为编译器抱怨Lambda表达式.任何人都可以帮我解决这个问题吗?

更新:

我改变为动态时得到的错误是:

如果不首先将lambda表达式转换为委托或表达式树类型,则不能将lambda表达式用作动态分派的操作的参数

UPDATE2:

还有另一个问题,我有很多逻辑使用从上面发生的lamda表达式中选择的数据.像:

if (val1.Where(c => c.ID == 3).Count() > 0)
{...}

我想根据从CurrentVal中选择的类型来转换这些值.所以我认为需要某种类型的反思.将其设置为IQueryable与将其设置为动态相同

所以我在想的是,但我不确定这样的事情是可能的.

if (((IQueryable<CurrentVal>)val1).Where(c => c.ID == 3).Count() > 0)
{...}

最佳答案 而不是最初使用动态for val,您可以使用IQueryable:

IQueryable val;

if (Currentval == Value1)
{
    val = (from c in datacontext.UniqueTable1
            select c);
}
else
{
    val = (from c in datacontext.UniqueTable2
            select c);
}

而且你的lambda可以适当地施放.

if (Currentval == Value1)
{
    val1 = ((IQueryable<UniqueTable1>)val).Where(c => c.Id == 2);
}
else if (Currentval == Value1)
{
    val1 = ((IQueryable<UniqueTable2>)val).Where(c => c.Id == 3);
}

问题:在你的例子中你有这样的演员:

(IQueryable<datacontex.UniqueTable1>)val

你确定你不是这个意思吗?

(IQueryable<UniqueTable1>)val

看来你正试图通过数据上下文的集合进行投射?

另外,val1仍然是一个IQueryable< T>,因为你只是构建Where子句而不是实际调用sql调用,你将如何调用ToList()?

把它归还给IQueryable< T>?

似乎在这里使用动态可能不是最好的方法,因为它似乎增加了不必要的混淆,而不是为UniqueTable1和UniqueTable2分离出你的数据访问层

点赞