我做了我的研究,但我仍然无法找到解决这个问题的方法.我有一个程序使用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分离出你的数据访问层