基本上,我想创建一个方法,它接受一个基类作为参数,并且可以用于派生类的“泛型”
ef-code-first类:
基类
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
}但在该方法中不包含任何记录。
有没有可能,我想要做的事...?这有意义吗?
不存在设计时、编译时或运行时错误,但传递给该方法时,传递的对象不包含记录,但在调用语句中包含记录。
我做错什么了?
有没有更好的方法?
我需要这个方法,用于操作超过两个(也许十个)的派生类,因此我希望它是“泛型”的。
谢谢!
发布于 2012-10-25 04:55:47
面对这样的情况,我喜欢简化我的代码。
我会尝试从方法调用中删除_dA.Where(a => a.Name.StartsWith("a name"))和_dB.Where(a => a.Id==5),并首先将它们放入变量中(然后将变量传递给方法)。
这将允许您更好地检查您的代码,并可能阐明问题。
发布于 2012-10-25 05:13:13
在将查询传递给方法之前,添加.ToList()以实体化查询:
genericMethod(_dA.Where(a => a.Name.StartsWith("a name"))).ToList());否则,您并没有真正传递查询的结果,而只是传递了一个需要首先计算的查询。ToList()将为您计算它的值。当你查看调试器手表时,它基本上是在为你动态地计算它,这就是为什么你会看到返回的行。
在此之后,将您的方法更改为处理IList而不是IQueryable。
https://stackoverflow.com/questions/13057389
复制相似问题