ASP.NET MVC - проблема System.Data.DataSet, на которую нет ссылки - PullRequest
1 голос
/ 23 октября 2009

Ну, во-первых, извините за этот вопрос, это должно быть довольно просто для вас, ребята, но я бьюсь над этим, и мне нужно, чтобы он работал :( Ну, я пытаюсь использовать DataSet в моем приложении

и когда я рендерил это, я получил:

The type 'System.Data.DataSet' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Data

в моем приложении System.Data уже ссылается на C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ System.Data.dll

и я использую в своих предложениях об использовании

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;

Этот набор данных является ответом веб-службы Так какие-нибудь идеи о том, как решить эту проблему?

PS. Я не знаю, помогает ли это, но я использую nHaml для визуализации моего представления

Большое спасибо


UPDATE:

Единственное решение, которое я нашел на данный момент, было вместо этого передать DataSet преобразователю представления DataSet в

<List<List<String>>

и пропустите цикл по всему DataSet следующим образом

List<List<String>> myList = new List<List<String>>();

foreach (DataRow row in dsTrades.Tables[0].Rows)
{
    List<String> myListColumns = new List<String>();

    for (var index = 0; index < dsTrades.Tables[0].Columns.Count; index ++)
    {
        myListColumns.Add(row[index].ToString());
    }

    myList.Add(myListColumns);
}

// THIS SHOULD BE THE DATASET AND NOW 
// IT'S CONVERTED TO A LIST WITH STRINGS LIST INSIDE
viewModel.Trades = myList; 

return View(viewModel);

На самом деле это совершенно безумие, не так ли?

Вся эта работа может быть легко выполнена в виде, если использовать DataSet напрямую Я надеюсь, что кто-нибудь может помочь мне с более упрощенным способом сделать это

Спасибо:)


ОБНОВЛЕНИЕ (РЕШЕНИЕ)

Ответ Саймона был действительно эффективным, и он работал с первой попытки после добавления пространств имен для System.Data и System.Xml, но в то же время ответ Джоша представляет собой очень хороший и классный способ работы с DataSets, который, на мой взгляд, работает намного лучше, и я думаю, что я пойду на это сейчас.

Спасибо за помощь

Ответы [ 3 ]

3 голосов
/ 24 октября 2009

попробуйте добавить явную ссылку на System.Data в вашей конфигурации nhaml

<?xml version="1.0"?>

<configuration>
...
    <configSections>
            <section name="nhaml" type="NHaml.Configuration.NHamlConfigurationSection, NHaml"/>
    </configSections>
...
<nhaml autoRecompile="true">
            <assemblies>
                    <clear/>
                    ...
                    <add assembly="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
            </assemblies>
            <namespaces>
                    <clear/>
                    ...
                    <add namespace="System.Data"/>
            </namespaces>
    </nhaml>

очевидно заменяет "..." другими ссылками и конфигом

1 голос
/ 23 октября 2009

Единственное, о чем я мог подумать, это то, что в контексте страницы ссылка System.Data не видна.

Попробуйте добавить пространство имен в ваш web.config:

<pages>
   <controls />
   <namespaces>
      <add namespace="System.Data"/>
   </namespaces>
</pages>

Я знаю, что это на самом деле не часть вашего вопроса, но я бы порекомендовал создать класс, заполненный свойствами, представляющими поля в вашей таблице данных. Используя Linq, вы можете легко преобразовать ваши строки в объект класса и вернуть их список. Вот примерный (и не скомпилированный) код.

[Serializable]
public class MyClass
{
   public string Property1 { get; set; }
   public string Property1 { get; set; }
}

Вы хотите, чтобы он был сериализуемым, чтобы ваш веб-сервис мог возвращать его как xml или json (однако вы его возвращаете). Линк будет выглядеть примерно так:

var result = from r in dataSet.Table[0].Rows.AsEnumerable()
             select new MyClass() {
                Property1 = r["Field1"].ToString()
                Property2 = r["Field2"].ToString()
             };

return result.ToList();

По моему личному опыту, наборы данных, как правило, занимают много места. Кроме того, Linq будет более эффективным, чем ваши циклы for.

Надеюсь, это поможет.

0 голосов
/ 17 декабря 2009

Удалите референцию (system.Data) ..и добавьте ту же референцию снова .. это может быть работой ..

...