[英]Need to cast a IQueryable<T> at runtime
我已经进行了研究,但仍然无法找到解决该问题的方法。 我有一个程序,它使用带有linq to sql的lambda表达式。 我想将主要的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表达式用作动态调度操作的参数
更新2:
这还有另一个问题,我有很多逻辑可以利用从上面发生的lamda表达式中选择的数据。 像:
if (val1.Where(c => c.ID == 3).Count() > 0)
{...}
我想根据从CurrentVal选择的类型来转换这些值。 所以我认为需要某种类型的反思。 将其设置为IQueryable与将其设置为dynamic相同
所以我在想的是类似的东西,但是我不确定这样的事情是否可能。
if (((IQueryable<CurrentVal>)val1).Where(c => c.ID == 3).Count() > 0)
{...}
您可以先使用IQueryable
来代替使用dynamic for val:
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分离出数据访问层
这对我有用:
val = (from c in datacontext.UniqueTable1 select c)*.AsQueryable()*;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.