我有一个返回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的类型?
答案 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>
}