如何从一个IQueryable变量中获取数据字段?

3
我有以下代码:-
public IQueryable GetPerson(int PersonID)
    {

        var Details = from pers in db.People
              where pers.ID == PersonID
                      select new
                          {
                              Name = item.NAME,
                              Email = item.EMAIL
                          };

        return Details
    }

我不想从上面的数据访问代码中返回特定的类型。

然后我想做这样的事情:

 IQueryable Person = dal.GetPerson(PersonID);
 PersonEmail = Person.EMAIL;  - but this obviously doesn't work ??

有什么办法可以从Person IQueryable对象中获取字段数据吗?

3个回答

3
实际上,你无法以任何有用的方式从方法中返回匿名类型。虽然你的方法可以编译并工作,但你实际上只有一个对象的IQueryable集合,并且无法访问其中包含的匿名类型的属性。除非你返回 IQueryable<Person>,否则你根本无法访问返回对象的属性,因为匿名类型只在其创建的范围内真正有用。也许你可以通过反射做一些可怕的事情来获取数据,但我不建议这样做。为什么你不想返回 IQueryable<Person>

不返回IQueryable<Person>的原因是因为我正在数据访问类中创建一个LINQ连接,不想创建一个特定的类类型来返回它和连接字段...但听起来我可能必须这样做? - cyberbobcat
1
是的,您需要创建一个新类,该类包含两个类的属性。 - Ben Robinson

0
我能想到两种替代方案:
  • 如果你的项目有相同的核心属性名称,那么创建一个抽象类,并让你的方法返回一个IQueryable项目。
  • 以字典的形式返回项目,而不是单独返回,这样你就可以访问你想要的名称及其关联的值。

-1
问题在于 IQueryable 是一个集合:在这种情况下是 IQueryable<[annonymous]> 或类似的东西。

尝试使用 IEnumerable 作为您的返回类型,然后执行以下操作:

IEnumerable foundPerson = dal.GetPerson(personId);
string PersonEmail = foundPerson[0].Email;

注意:你也可以使用 IQueryable 来完成这个操作:我从未尝试过,而且此时我也没有查看接口文档。

更正:由于 GetPerson() 是自己的方法,所以你会失去匿名类型并只得到一个对象。简单的纠正方法是使用命名类型(类或结构体),尽管显然有一些黑科技(不建议使用)可以绕过这个问题。

另一个选择可能是使用 Lambda 表达式,它将根据情况返回所需的数据,但这样做可能会导致相当多的代码重复。


这样做是不行的。IEnumerable不支持索引,即使它支持,也不会有Email属性,因为该项将是一个没有电子邮件属性的对象。 - Ben Robinson
@Ben - 啊,你说得对:由于GetPerson()是自己的方法...我忽略了那部分。 - AllenG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接