Как получить доступ к данным в IQueryable? - PullRequest
8 голосов
/ 29 января 2010

У меня есть объект IQueryable, и мне нужно взять данные внутри IQueryable, чтобы поместить их в элементы управления Textboxs. Возможно ли это?

Я пытаюсь что-то вроде:

public void setdata (IQueryable mydata)
{

    textbox1.text = mydata.????

}

Обновление:

Я делаю это:

public IQueryable getData(String tableName, Hashtable myparams)
{
        decimal id = 0;

        if (myparams.ContainsKey("id") == true)
             id = (decimal)myparams["id"];

        Type myType= Type.GetType("ORM_Linq." + tableName + ", ORM_Linq");

        return this.GetTable(tableName , "select * from Articu where id_tipo_p = '" + id + "'");

}


public IQueryable<T> GetTable<T>(System.Linq.Expressions.Expression<Func<T, bool>> predicate) where T : class
{
    return _datacontext.GetTable<T>().Where(predicate);
}

Возвращает {System.Data.Linq.SqlClient.SqlProvider+OneTimeEnumerable 1 [ORM_Linq.Articu]} `

Я не вижу такого способа, как ты мне говоришь. Я вижу Cast <>, Expression, ToString ...

Ответы [ 5 ]

7 голосов
/ 29 января 2010

РЕДАКТИРОВАТЬ: Обновлено на основе дополнительной информации из других ваших сообщений ...

Ваш getData метод возвращает IQueryable вместо строго типизированного результата, поэтому вы в конечном итоге и разыгрываете его. Попробуйте изменить его на:

public IQueryable<ORM_Linq.Articu> getData(...)

Вы пытаетесь запросить "Articu" из разных таблиц?

С учетом вышеуказанного изменения ваш код можно переписать следующим образом:

ORM_Linq.Articu result = mydata.SingleOrDefault();
if (result != null)
{
    TextBoxCode.Text = result.id.ToString();
    TextBoxName.Text = result.descrip; 
}


Если у вас есть один результат, используйте SingleOrDefault , который будет возвращать значение по умолчанию, если результаты не возвращаются:
var result = mydata.SingleOrDefault();
if (result != null)
{
       textbox1.text = result.ProductName; // use the column name
}
else
{
    // do something
}

Если у вас есть несколько результатов, обведите их:

foreach (var item in mydata)
{
   string name = item.ProductName;
   int id = item.ProductId;
   // etc..
}
1 голос
/ 29 января 2010

Во-первых, вы должны использовать строго типизированную версию IQueryable. Скажем, что ваши объекты имеют тип MyObject и что MyObject имеет свойство с именем Name типа string Затем сначала измените параметр mydata на тип IQueryable<MyObject>:

public void setdata (IQueryable<MyObject> mydata)

Тогда мы можем написать такое тело, чтобы фактически получить некоторые данные. Допустим, мы просто хотим получить первый результат запроса:

public void setdata (IQueryable<MyObject> mydata) {
    MyObject first = mydata.FirstOrDefault();
    if(first != null) {
        textbox1.Text = first.Name;
    }
}

Или, если вы хотите объединить все имена:

public void setdata(IQueryable<MyObject> mydata) {
    string text = String.Join(", ", mydata.Select(x => x.Name).ToArray());
    textbo1.Text = text;
}
0 голосов
/ 29 сентября 2010

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

Это очень хорошо, если вы статически определяете пользовательский интерфейс для поиска и отображения результатов по отношению к источнику данных, известному во время компиляции. Не очень хорошо, если вы пытаетесь создать систему, которая подключается к существующим источникам данных, известным только во время выполнения и определяемым данными конфигурации.

0 голосов
/ 29 января 2010

Ну, как следует из названия, объект, реализующий IQueryable, ... Queryable! Вам нужно написать запрос linq, чтобы узнать внутренние детали вашего объекта IQueryable. В своем запросе linq вы сможете извлекать его данные и назначать их биты там, где вам нравится - например, в текстовом поле.

Вот отличная отправная точка для изучения Linq .

0 голосов
/ 29 января 2010

Если вы ожидаете только одно значение, просто вызовите метод FirstOrDefault().

public void setdata (IQueryable mydata)
{
    textbox1.text = mydata.FirstOrDefault().PropertyName;
}
...