0

基本上,我想创建一个方法,它将基类作为参数,并且可以用于派生类的“通用”

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 
}

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

有可能吗,我正在尝试做什么......?是否有意义?

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

我做错了什么?

有更好的方法吗?-

我需要这个方法来操作两个以上(可能是十个)派生类,因此我希望它“通用”。

谢谢!

4

2 回答 2

1

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

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

这将使您能够更好地检查您的代码,并可能阐明问题。

于 2012-10-24T20:55:47.220 回答
0

在将查询传递给方法之前添加 .ToList() 以实现查询:

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

否则你并没有真正传递查询的结果,你只是传递了一个需要首先评估的查询。ToList() 将为您评估它。当您查看调试器监视时,它基本上是在动态地为您评估它,这就是您看到返回行的原因。

之后,更改您的方法以处理 IList 而不是 IQueryable。

于 2012-10-24T21:13:12.940 回答