运行时的Iqueryable类型

时间:2014-03-24 13:02:46

标签: asp.net-mvc c#-4.0 iqueryable

我有一个返回Iqueryable结果的方法,但结果是基于if else条件,如果条件满足则我将使用“AssetDetails”类对象,否则使用“UserandClientdetails”对象。  这是代码:

  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的类型?

2 个答案:

答案 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
}

答案 1 :(得分: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>
}