我完成了我的研究,但我仍然无法找到解决这个问题的方法。我有一个程序使用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 与将其设置为 dynamic
的行相同所以我的想法是这样的,但我不确定这样的事情是可能的。
if (((IQueryable<CurrentVal>)val1).Where(c => c.ID == 3).Count() > 0)
{...}
答案 0 :(得分:4)
您最初可以使用IQueryable
而不是使用动态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分离出数据访问层
答案 1 :(得分:-2)
这对我有用:
val = (from c in datacontext.UniqueTable1 select c)*.AsQueryable()*;