Linq 使用接口强制转换访问属性

Linq 使用接口强制转换访问属性,linq,entity-framework,interface,Linq,Entity Framework,Interface,ActionBase、ActionA、ActionB和ActionC是实体(来自数据库)。ActionA、ActionB和ActionC是ActionBase的派生类型 ActionB和ActionC使用SpecialProperty实现isSpecialAction 例: 我的问题是SpecialProperty是从对象的其他属性(ActionB或ActionC)构建的,当转换(到IsSpecialAction)完成时,OtherProperty和OtherProperty2为空。 我试过:

ActionBase、ActionA、ActionB和ActionC是实体(来自数据库)。ActionA、ActionB和ActionC是ActionBase的派生类型

ActionB和ActionC使用SpecialProperty实现isSpecialAction

例:

我的问题是SpecialProperty是从对象的其他属性(ActionB或ActionC)构建的,当转换(到IsSpecialAction)完成时,OtherProperty和OtherProperty2为空。 我试过:

GetActionBase().ToList().Where(x=>x is ISpecialAction && ((dynamic) x).SpecialProperty== p_SpecialProperty);
GetActionBase().ToList().Where(x=>x is ISpecialAction && ((ISpecialAction) x).SpecialProperty== p_SpecialProperty);
GetActionBase().ToList().OfType<ISpecialAction>().Where(x => x.SpecialProperty== p_SpecialProperty).Cast<ActionBase>();
return GetActionOnGoing().ToList().OfType<ICityAction>().Cast<ActionBase>().Where(x => ((dynamic)x).CityId == p_CityId);
GetActionBase().ToList()。其中(x=>x是isSpecialAction&((动态)x)。SpecialProperty==p_SpecialProperty);
GetActionBase().ToList()。其中(x=>x是isSpecialAction&((isSpecialAction)x)。SpecialProperty==p_SpecialProperty);
GetActionBase().ToList().OfType()。其中(x=>x.SpecialProperty==p_SpecialProperty).Cast();
返回getActionContinuous().ToList().OfType().Cast().Where(x=>((动态)x).CityId==p_CityId);
备注:类型的
不适用于LINQtoEntities中的接口,但在LINQtoObject中可以


如何在不知道对象类型的情况下访问属性接口?

我不确定是否完全理解您的问题,但您能否尝试使用中间接口,例如:

public interface ISpecialActionB : ISpecialAction
{
    objectZ OnePropertyB { get; set; }
}

public class ActionB : ActionBase, ISpecialActionB
{
    //same stuff
}
相反,我选择了这一点

var b = new ActionB{OnePropertyB = new Whatever()};

var bAsSpecial = b as ISpecialActionB;

var whatever =  b.OnePropertyB; // should not be null

我可能遗漏了一些内容,但您提供的代码没有问题:

public class objectX
{

}
public class objectY
{

}
public class objectZ
{
    public Guid ID { get { return Guid.NewGuid();} }
}
public class objectW
{
    public Guid ID { get { return new Guid(); } }
}

class Program
{
    private static Guid p_SpecialProperty;
    static void Main(string[] args)
    {
        var result = GetActionBase().ToList().Where(x => x is ISpecialAction && ((dynamic)x).SpecialProperty == p_SpecialProperty).FirstOrDefault();
        var result1 = GetActionBase().ToList().Where(x => x is ISpecialAction && ((ISpecialAction)x).SpecialProperty == p_SpecialProperty).FirstOrDefault();
        var result2 = GetActionBase().ToList().OfType<ISpecialAction>().Where(x => x.SpecialProperty == p_SpecialProperty).Cast<ActionBase>().FirstOrDefault();
                }

    private static IEnumerable<ActionBase> GetActionBase()
    {
        return new List<ActionBase> {new ActionA{OnePropertyA= new objectY()}, new ActionB{OnePropertyB=new objectZ()},new ActionC{OnePropertyC=new objectW()} };
    }
}
公共类objectX
{
}
公共类反对
{
}
公共类对象
{
公共Guid ID{get{return Guid.NewGuid();}}
}
公共类对象
{
公共Guid ID{get{返回新Guid();}}
}
班级计划
{
专用静态Guid p_专用属性;
静态void Main(字符串[]参数)
{
var result=GetActionBase().ToList()。其中(x=>x是isSpecialAction&((动态)x)。SpecialProperty==p_SpecialProperty)。FirstOrDefault();
var result1=GetActionBase().ToList()。其中(x=>x是isSpecialAction&((isSpecialAction)x)。SpecialProperty==p_SpecialProperty)。FirstOrDefault();
var result2=GetActionBase().ToList().OfType().Where(x=>x.SpecialProperty==p_SpecialProperty).Cast().FirstOrDefault();
}
私有静态IEnumerable GetActionBase()
{
返回新列表{new ActionA{OnePropertyA=new objectY()},新ActionB{OnePropertyB=new objectZ()},新ActionC{OnePropertyC=new objectW()};
}
}
没问题

您的示例运行得很好,没有问题,所以我用另一种方式搜索:AutoMapper

l_List.Actions = Mapper.Map<List<ActionBase>, Action[]>(l_ActionManagement.GetActionBySpecialId(l_Special.ID).ToList());
l_List.Actions=Mapper.Map(l_ActionManagement.GetActionBySpecialId(l_Special.ID).ToList());
问题不是接口或Linq查询,而是automapper需要一个空构造函数,在这个构造函数中,我需要初始化OnePropertyB和OnePropertyC来计算SpecialProperty


谢谢

我想你是指
OnePropertyA
OnePropertyB
而不是
OtherProperty
OtherProperty2
?而
OnePropertyA
OnePropertyB
是映射属性吗?
l_List.Actions = Mapper.Map<List<ActionBase>, Action[]>(l_ActionManagement.GetActionBySpecialId(l_Special.ID).ToList());