簡體   English   中英

需要強制轉換為IQueryable <T> 在運行時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM