2014-03-24 59 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 
}