Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要铸造一个iquiryable<;T>;运行时_C#_Linq To Sql - Fatal编程技术网

C# 需要铸造一个iquiryable<;T>;运行时

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.

我已经做了研究,但仍然找不到解决这个问题的办法。我有一个程序,它使用lambda表达式和linqtosql。我想将主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);
}
我想根据从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()*;