Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从IQueryable变量获取数据字段?_C# - Fatal编程技术网

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

C# 如何从IQueryable变量获取数据字段?,c#,C#,我有以下代码:- public IQueryable GetPerson(int PersonID) { var Details = from pers in db.People where pers.ID == PersonID select new { Name = item.NAME

我有以下代码:-

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对象获取字段数据,您有什么想法吗?

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

问题在于
IQueryable
是一个集合:在本例中是
IQueryable
或类似的集合

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

IEnumerable foundPerson = dal.GetPerson(personId);
string PersonEmail = foundPerson[0].Email;
注意:您也可以使用
IQueryable
来实现这一点:我从未尝试过,目前我也没有查看接口文档

更正:因为
GetPerson()
是它自己的方法,所以您确实丢失了匿名类型,只得到了一个对象。纠正这种情况的简单方法是使用命名类型(类或结构),尽管显然有一些黑客(不推荐)允许您绕过这种情况


另一种选择可能是
Lambda表达式
,它将根据具体情况提取所需的数据,但随后可能会有大量代码重复。

我可以想出两种选择:

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

这不起作用。IEnumerable不支持索引,即使它支持,也不会有电子邮件属性,因为该项将是一个没有电子邮件属性的对象。@Ben-Ah-你是对的:因为GetPerson()是它自己的方法。。。忽略了这一部分。不返回IQueryable的原因是因为我正在数据访问类中创建一个LINQ连接,并且不想创建一个特定的类类型来返回该类型和连接的字段……但听起来我可能不得不??是的,您必须创建一个包含这两个类的属性的新类。