C# 需要铸造一个iquiryable<;T>;运行时
我已经做了研究,但仍然找不到解决这个问题的办法。我有一个程序,它使用lambda表达式和linqtosql。我想将主linq对象实例化为一个动态对象,并在程序的其余部分中根据指定的值将其转换为不同的类型。例如:C# 需要铸造一个iquiryable<;T>;运行时,c#,linq-to-sql,C#,Linq To Sql,我已经做了研究,但仍然找不到解决这个问题的办法。我有一个程序,它使用lambda表达式和linqtosql。我想将主linq对象实例化为一个动态对象,并在程序的其余部分中根据指定的值将其转换为不同的类型。例如: int Value1 = 'Ob1'; int Value2 = 'OB2'; int Currentval = Value1; dynamic val; if (Currentval == Value1; val = (from c in datacontext.
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);
}
我想根据从CurrentVal中选择的类型强制转换这些值。所以我认为需要某种类型的反思。将其设置为IQueryable与将其设置为dynamic相同
所以我的想法是这样的,但我不确定这样的事情是可能的
if (((IQueryable<CurrentVal>)val1).Where(c => c.ID == 3).Count() > 0)
{...}
if((IQueryable)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);
}
if(Currentval==Value1)
{
val1=((IQueryable)val)。其中(c=>c.Id==2);
}
else if(Currentval==Value1)
{
val1=((IQueryable)val)。其中(c=>c.Id==3);
}
问题:在你的例子中,你的演员阵容如下:
(IQueryable<datacontex.UniqueTable1>)val
(IQueryable)val
你确定你不是这个意思吗
(IQueryable<UniqueTable1>)val
(IQueryable)val
看起来您正试图通过数据上下文上的集合强制转换
另一方面,val1仍然是一个IQueryable
,因为您只是构建Where
子句,而不是实际调用sql调用,您将如何调用ToList()
将其强制转换回IQueryable
在这里使用dynamic似乎不是最好的方法,因为它似乎会增加不必要的混乱,而不仅仅是将UniqueTable1和UniqueTable2的数据访问层分开
val = (from c in datacontext.UniqueTable1 select c)*.AsQueryable()*;
(人们想知道我为什么反对动态…:-/)如果可以的话,发布你得到的错误。什么是
datacontex.UniqueTable1
?你想在这里干什么?如果您想拥有一个非类型化对象,然后对其进行强制转换,您可以使用object
并进行强制转换(或者想出更好的设计)。你不是在做动态调度,为什么要用动态调度呢?这使得很多事情都是从Mark开始的。我试试看。我实际上在做的是循环浏览数据,并根据不同的标准越来越多地进行过滤。这是一个尝试的建议。请发表评论。但在你亲自尝试之前,我相信这不会有什么不同。为什么要这样做?(from…
语句已经是IQueryable
。我没有编辑它。我没有尝试,因为很明显,AsQueryable()
没有什么区别(只需检查它的输入和输出)。在尝试了OP的代码之后,我发现这个问题没有多大意义,因为将动态变量强制转换为IQueryable
不会产生编译器错误。这使得问题完全不清楚,因此毫无用处。
val = (from c in datacontext.UniqueTable1 select c)*.AsQueryable()*;