2014-03-24 55 views
0

我有一個方法返回Iqueryable結果,但結果是基於if else條件,如果條件滿足那麼我將使用「AssetDetails」類對象,否則爲「UserandClientdetails」對象。 下面是代碼:運行時Iqueryable的類型

private IQueryable<?> GetAssetDetails(ShareViewModel item) 
       { 
      ... 
       if (type == "Video") 
        { 
    if (type == "Video") 
        { 
        return from meta in my.Assets().OfType<Model.Video>() 
          join content in my.Contents() on meta.ContentId equals content.ID 
          join channel in my.Channels() on content.ChannelId equals channel.ID 
          where meta.ID == item.ID 
          select new AssetDetails 
          { 
           ContentTitle = content.Title, 
           ChannelName = channel.ChannelName, 
           ... 
          }; 
         } 
       else 
    { return from meta in my.Assets().OfType<Model.Client>() 
          join country in db.Countries on meta.ResellerCountry equals country.ID      
          where meta.ID == item.ID 
          select new UserAndClientDetails 
          { 
           Name = meta.ResellerName, 
           UserName = meta.ResellerEmail, 
           .. 



    };} 

那麼如何在運行時決定Iqueyable的類型在這裏?

+0

將實體框架排除在圖片之外。如果你有一條採用兩條路徑返回完全不同的東西的方法,你會怎麼做? – Dismissile

+0

您可以嘗試簡單地返回'IQueryable'而不是泛型'IQueryable <>'。 –

回答

0

如何使用基類?

public abstract class BaseDetails 
{ 
    // ... 
} 

public class AssetDetails : BaseDetails 
{ 
    // ... 
} 
public class UserAndClientDetails: BaseDetails 
{ 
    // ... 
} 

然後你的方法是這樣的:

private IQueryable<BaseDetails> GetAssetDetails(ShareViewModel item) 
{ 
    // return either IQueryable<AssetDetails> or IQueryable<UserAndClientDetails> 
} 
+0

可能是錯誤的,但我的頭頂,我不認爲這將實際工作。這是一個協變問題 - 儘管'AssetDetails'是一種'BaseDetails','IQueryable '不是'IQueryable '的類型。 –

+0

@ChrisPratt你會錯的 – Dismissile

+0

你說得對。我只是測試它,它工作正常。對於那個很抱歉。 –

1

所以,我能夠證實這個作品,所以我會繼續和張貼作爲一個答案。您可以返回IQueryable而不是通用IQueryable<>。這將接受任何IQueryable<T>。然而,IQueryable,因爲它沒有直接內在的類型,是非常有限。所以,你仍然有可能需要轉換爲IQueryable<>在其他一些點在你的代碼做成任何事情:

// Piece of code where you know you are working with `IQueryable<AssetDetails>` 
IQueryable<AssetDetails> assetDetails = GetAssetDetails(someItem); 

這是一個有點危險,不過,因爲你假設你的代碼工作完美,正確的類型正在返回。最好是:

try 
{ 
    var assetDetails = (IQueryable<AssetDetails>)GetAssetDetails(someItem); 
    // do something with `assetDetails` 
} 
catch (InvalidCastException) 
{ 
    // recover gracefully 
}