我已经完成了我的研究,但我仍然无法找到解决这个问题的方法。我有一个程序在 linq to sql 中使用 lambda 表达式。我想将主要的 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);
}
Run Code Online (Sandbox Code Playgroud)
你不能做我上面提议的,因为编译器抱怨 Lambda 表达式。谁能帮我解决这个问题?
更新:
更改为动态时出现的错误是:
如果没有首先将 lambda 表达式强制转换为委托或表达式树类型,则不能将 lambda 表达式用作动态调度操作的参数
更新2:
这还有一个问题,我有很多逻辑可以利用从上面发生的 lamda 表达式中选择的数据。像:
if (val1.Where(c => c.ID == 3).Count() > 0)
{...}
Run Code Online (Sandbox Code Playgroud)
我想根据从中选择的类型来转换这些值 CurrentVal 中。所以我认为需要某种类型的反射。将其设置为IQueryable与将其设置为动态相同
所以我在想什么,但我不确定这样的事情是否可能。
if (((IQueryable<CurrentVal>)val1).Where(c => c.ID == 3).Count() > 0)
{...}
Run Code Online (Sandbox Code Playgroud)
您可以使用IQueryable:
IQueryable val;
if (Currentval == Value1)
{
val = (from c in datacontext.UniqueTable1
select c);
}
else
{
val = (from c in datacontext.UniqueTable2
select c);
}
Run Code Online (Sandbox Code Playgroud)
与你的 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);
}
Run Code Online (Sandbox Code Playgroud)
问题:在您的示例中,您的演员阵容如下:
(IQueryable<datacontex.UniqueTable1>)val
Run Code Online (Sandbox Code Playgroud)
你确定你不是这个意思吗
(IQueryable<UniqueTable1>)val
Run Code Online (Sandbox Code Playgroud)
看来您正在尝试通过数据上下文上的集合进行转换?
顺便说一句, val1 仍然是一个IQueryable<T>,因为您只是构建Where子句而不是实际调用 sql 调用,那么您将如何调用ToList()?
将其投射回IQueryable<T>?
似乎在这里使用动态可能不是最好的方法,因为它似乎增加了不必要的混乱,而不是仅仅分离出 UniqueTable1 和 UniqueTable2 的数据访问层
| 归档时间: |
|
| 查看次数: |
3790 次 |
| 最近记录: |