基本上,我想创建一个Method,它将一个基类作为参数,并且可以对派生类使用“generic”
ef-code-first classes:
基类
public abstract class BaseClass
{
public int Id { get; set; }
public string Name { get; set; }
}
派生类:
public class DerivedA:BaseClass
{
public string AValue {get;set;}
...more specific fields
}
public class DerivedB:BaseClass
{
public string BValue {get;set;}
..... more specific fields
}
我用这些稍微不同的对象调用“泛型方法”:
System.Data.Entity.DbSet<DerivedA> _dA....
System.Data.Entity.DbSet<DerivedB> _dB....
genericMethod(_dA.Where(a => a.Name.StartsWith("a name")))); //<-contains records
genericMethod(_dB.Where(a => a.Id==5)); //<---- contains records
“Where ...”包含调试中的记录(点击枚举后)
现在方法:
public string genericMethod(<IQueryable>BaseClass _myClass)
{
foreach (BaseClass c in _myClass) // <-------class is empty - no records
{
// do something usefull...
}
return someResult
}
但是在方法内部没有包含记录。
有可能,我想做什么......? 它有意义吗?
没有设计时或编译时或运行时错误,但传递的对象在传递给方法时不包含任何记录,但它包含调用语句中的记录。
我做错了什么?
有更好的方法吗? -
我需要这个方法,用于操作两个以上(可能十个)派生类,因此我希望它“通用”。
谢谢!
答案 0 :(得分:1)
当面对这样的事情时,我喜欢简化我的代码。
我会尝试从方法调用中删除_dA.Where(a => a.Name.StartsWith("a name"))
和_dB.Where(a => a.Id==5)
,然后将它们放入变量中(然后将变量传递给方法)。
这将使您能够更好地检查您的代码,并可能解决问题。
答案 1 :(得分:0)
添加.ToList()以在将查询传递给方法之前实现查询:
genericMethod(_dA.Where(a => a.Name.StartsWith("a name"))).ToList());
否则,您实际上并未传递查询结果,而只是传递需要首先评估的查询。 ToList()将为您评估它。当你查看调试器手表时,它基本上是为你动态评估它,这就是你看到返回行的原因。
之后,更改您的方法以处理IList而不是IQueryable。