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

时间:2010-08-12 14:06:50

标签: c#

我有以下代码: -

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 个答案:

答案 0 :(得分:2)

实际上,您无法以任何有用的方式从方法返回匿名类型。您的方法将编译和工作,但您基本上有一个IQueryable对象集合,您不能访问其中包含的匿名类型的属性。除非您返回IQueryable<Person>,否则您无法访问返回对象的属性,因此匿名类型仅在创建它们的范围内非常有用。可能有些可怕的事情你可以用反射来获取数据,但我不会建议沿着那条路走下去。为什么你不想退回IQueryable<Person>

答案 1 :(得分:0)

我可以想到两种选择:

  • 如果您的商品具有与将要使用的相同的核心属性,则创建一个抽象类,并让您的方法返回一个IQueryable商品。
  • 返回字典中的项目,而不是单独返回,这样您就可以访问所需的名称及其相关值。

答案 2 :(得分:-2)

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

尝试使用IEnumerable作为返回类型,然后执行:

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

注意:您也可以使用IQueryable执行此操作:我从未尝试过,而且我现在还没有查看该界面的文档。

更正:由于GetPerson()是它自己的方法,你确实会丢失你的匿名类型并只返回一个Object。解决这个问题的简单方法是使用命名类型(类或结构),但显然有一些黑客(不推荐)允许你绕过它。

另一个选项可能是Lambda表达式,它会根据具体情况撤回所需的数据,但是你可能会有相当多的代码重复。