需要在运行时</t>转换IQueryable <t>

时间:2011-03-18 18:01:50

标签: c# linq-to-sql

我完成了我的研究,但我仍然无法找到解决这个问题的方法。我有一个程序使用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)
{...}

2 个答案:

答案 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()*;