[英]Need to cast a IQueryable<T> at runtime
我已經進行了研究,但仍然無法找到解決該問題的方法。 我有一個程序,它使用帶有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);
}
您不能執行我上面建議的操作,因為編譯器抱怨Lambda表達式。 誰能幫我這個忙嗎?
更新:
更改為動態時遇到的錯誤是:
在未先將lambda表達式轉換為委托或表達式樹類型之前,不能將lambda表達式用作動態調度操作的參數
更新2:
這還有另一個問題,我有很多邏輯可以利用從上面發生的lamda表達式中選擇的數據。 像:
if (val1.Where(c => c.ID == 3).Count() > 0)
{...}
我想根據從CurrentVal選擇的類型來轉換這些值。 所以我認為需要某種類型的反思。 將其設置為IQueryable與將其設置為dynamic相同
所以我在想的是類似的東西,但是我不確定這樣的事情是否可能。
if (((IQueryable<CurrentVal>)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);
}
問題:在您的示例中,您具有以下類型:
(IQueryable<datacontex.UniqueTable1>)val
你確定你不是這個意思嗎
(IQueryable<UniqueTable1>)val
看起來您正在嘗試通過集合在數據上下文上進行投射?
附帶一提 ,val1仍然是IQueryable<T>
,因為您只是在構建Where
子句而不是實際調用sql調用,您將如何調用ToList()
?
將其轉換回IQueryable<T>
?
似乎在這里使用動態方法可能不是最好的方法,因為它似乎增加了不必要的混亂,而不是僅僅為UniqueTable1和UniqueTable2分離出數據訪問層
這對我有用:
val = (from c in datacontext.UniqueTable1 select c)*.AsQueryable()*;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.