gpt4 book ai didi

c# - 需要在运行时转换 IQueryable

转载 作者:行者123 更新时间:2023-11-30 12:35:31 24 4
gpt4 key购买 nike

我已完成研究,但仍无法找到解决此问题的方法。我有一个程序将 lambda 表达式与 linq to 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 表达式转换为委托(delegate)或表达式树类型,则不能将其用作动态分派(dispatch)操作的参数

更新2:

还有另一个问题,我有很多逻辑使用从上面发生的 lamda 表达式中选择的数据。像这样的东西:

if (val1.Where(c => c.ID == 3).Count() > 0)
{...}

我想根据从 CurrentVal 中选择的类型转换这些值。所以我认为需要某种类型的反射(reflection)。将其设置为 IQueryable 与将其设置为 dynamic

的方法相同

所以我的想法是这样的,但我不确定这样的事情是否可能。

if (((IQueryable<CurrentVal>)val1).Where(c => c.ID == 3).Count() > 0)
{...}

最佳答案

您可以使用 IQueryable 而不是最初对 val 使用 dynamic相反:

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>

似乎在这里使用 dynamic 可能不是最好的方法,因为它似乎增加了不必要的困惑,而不是仅仅为 UniqueTable1 和 UniqueTable2 分离数据访问层

关于c# - 需要在运行时转换 IQueryable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5356022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com