【问题标题】:ASP.NET MVC get specific columns from table in EFASP.NET MVC 从 EF 中的表中获取特定列
【发布时间】:2016-11-05 09:18:43
【问题描述】:

我有一个包含以下列的表格。

CREATE TABLE [dbo].[tbl_QuizQue](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [question] [nvarchar](max) NOT NULL,
    [opt1] [nvarchar](50) NOT NULL,
    [opt2] [nvarchar](50) NOT NULL,
    [opt3] [nvarchar](50) NOT NULL,
    [ans] [nvarchar](50) NOT NULL
    )

我正在尝试从该表中获取随机记录,但只有特定列,例如 id、question、opt1、opt2、opt3。目前我正在获取随机记录,但它正在获取所有列。我尝试了下面的代码来获取具有特定列的记录

dbUserEntities obj = new dbUserEntities();
    // GET api/values
    public IEnumerable<tbl_QuizQue> Get()
    {
        var result = obj.tbl_QuizQue.OrderBy(r => Guid.NewGuid()).Select(o => new { o.id, o.question, o.opt1, o.opt2, o.opt3 });
        return result;
        }

在这里,我在return result; 时遇到错误

Cannot implicitly convert type 'System.Linq.IQueryable<AnonymousType#1>' to 
        'System.Collections.Generic.IEnumerable<studentQuiz.tbl_QuizQue>'. An explicit conversion exists (are you missing a cast?)

帮助我哪里做错了。

【问题讨论】:

  • 获取整个实体会更简单。您的列看起来其中之一不够大,不足以证明额外的复杂性。
  • result 的值是匿名对象的集合(使用.Select() 创建),而不是tbl_QuizQue 对象的集合,因此例外。

标签: c# mysql asp.net-mvc entity-framework


【解决方案1】:

我会这样做:

public IEnumerable<tbl_QuizQue> Get()
{
    var result = obj.tbl_QuizQue.OrderBy(r => Guid.NewGuid())
        .Select(o => new { o.id, o.question, o.opt1, o.opt2, o.opt3 })
        .AsEnumerable()
        .Select(q => new tblQuizQue {q.id, q.question, q.opt1, q.opt2, q.opt3);
    return result;
}

通过首先取回您感兴趣的列,您可以限制查询。然后,您可以将它们映射到您感兴趣的对象中。

【讨论】:

  • 感谢您的回复。但收到此错误无法使用集合初始化程序初始化类型“studentQuiz.tbl_QuizQue”,因为它没有实现“System.Collections.IEnumerable”
  • tbl_QuizQue 长什么样子?
  • 您可以在 tbl_QuizQue 的问题中看到 CREATE 脚本。
  • 就是这张桌子。 c# 类声明呢?这就是你提到的错误背后的原因。我怀疑您的 IEnumerable 返回类型不正确。
  • C# 代码:public IEnumerable Get() { var result = obj.tbl_QuizQue.OrderBy(r => Guid.NewGuid()) .Select(o => new { o .id, o.question, o.opt1, o.opt2, o.opt3 }) .AsEnumerable() .Select(q => new tbl_QuizQue {q.id, q.question, q.opt1, q.opt2, q .opt3});返回结果; }
【解决方案2】:

将Get函数的返回类型改为

IEnumerable<dynamic>

您的代码将执行。

至于好不好,我猜你得听从c#部落的风俗。

我很想一直使用它。

【讨论】:

  • 它在 REST 客户端中工作,我在其中获取特定列的记录。但是,在 Chrome 中我遇到了错误。 类型 'f__AnonymousType3`5[System.Int32,System.String,System.String,System.String,System.String]' 无法序列化。考虑使用 DataContractAttribute 属性对其进行标记,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。如果该类型是一个集合,请考虑使用 CollectionDataContractAttribute 对其进行标记。有关其他支持的类型,请参阅 Microsoft .NET Framework 文档。
  • 我不认为在这里使用dynamic 是非常好的架构。动态是一大罐蠕虫,就这样打开,你失去了类型安全。
  • 那是另一个问题。我很惊讶它在其余客户端中工作并在浏览器中失败。也许您没有设置正确的内容类型。看看这个:stackoverflow.com/questions/331976/…
  • 在浏览器中,我在 REST 客户端中得到 XML 格式和 JSON 格式的结果。
  • 这是你的新问题。如何将动态对象序列化为 XML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 2016-06-20
  • 1970-01-01
  • 2021-10-16
  • 2021-03-08
相关资源
最近更新 更多