2012-10-24 36 views
0

基本上,我想创建一个方法,采用一个基类作为参数,并且可以使用“通用”派生类通过相同的基类的不同的对象的方法

EF-代码 - 第一类:

基类

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 

两个“哪里......”包含调试记录

现在的方法(点击枚举后):

public string genericMethod(<IQueryable>BaseClass _myClass) 
{ 
    foreach (BaseClass c in _myClass) // <-------class is empty - no records 
     { 
      // do something usefull... 
     } 
    return someResult 
} 

但在方法内部不包含任何记录。

是否有可能,我正在尝试做什么...? 它有道理吗?

没有设计时或编译时或运行时错误,但传递的对象在传递给方法时不包含任何记录,但它包含调用语句中的记录。

我做错了什么?

有没有更好的方法? -

我需要这种方法,操纵多于两个(也许十个)派生类,因此我希望它“通用”。

谢谢!

+1

你确定没有编译时错误吗?我不认为你可以使用关键字“class”作为参数名,你的基类也不能工作。 – Ondra

+0

是泛型方法将获得混合DerivedA和DerivedB实例或只是其中之一? – kabaros

+0

昂德拉 - 对不起..为了便于阅读,简化了代码 - 当然,课程无法工作 - 将其更改为_myClass – reinhard

回答

1

当面对这样的事情时,我喜欢简化我的代码。

我会尝试从方法调用中移除_dA.Where(a => a.Name.StartsWith("a name"))_dB.Where(a => a.Id==5)并将它们首先放入变量(然后将该变量传递给方法)。

这将允许您更好地检查您的代码,并可能揭示问题。

+0

或者,只需删除Where()子句并在整个_dA集上调用它。 – Bobson

+1

虽然没有不好的建议,但这不是一个真正的答案。它可能有助于调试,但是这个重构不会改变代码的实际功能。 – Servy

+0

“给一个人一条鱼,你喂他一天,教一个人钓鱼,你一辈子喂他。”我选择教书。 – DeanOC

0

添加.ToList()将它传递给方法之前兑现查询:

genericMethod(_dA.Where(a => a.Name.StartsWith("a name"))).ToList()); 

否则你没有真正传递查询的结果,你只是路过,需要查询首先进行评估。 ToList()会为你评估它。当您查看调试器手表时,基本上是在即时为您进行评估,这就是为什么您会看到行被返回。

之后,改变你的方法来处理IList而不是IQueryable。

+1

当你想将一个查询转换成一个枚举时,你可以使用'AsEnumerable'。它具有使所有后续LINQ方法使用linq到对象,而不是linq到EF(或任何其他)的效果,但它不会将所有对象都带入内存。而且,这显然不是问题,因为他只是在对所有项目进行传递,而不是对它们执行另一个查询。 – Servy

+0

有趣的是,现在我的电话显示“一些无效参数”的错误 - 但我DID更改 _myBaseClass和_Where(....)。ToList() – reinhard

+0

尝试AsEnumerable(),但仍然没有数据记录内的方法,传入的对象中的记录。 – reinhard

相关问题