linq: Использование методов в предложении выбора - PullRequest
1 голос
/ 19 июня 2011

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

var resultTable = from item in dc.table
                    select new
                    {
                      id= item.id,
                      name= CreateString((from name in item.Ref_Items_Names
                               select name.Name).ToList()),
                    };

и CreateString ():

private string CreateString(List<string> list)
{
  StringBuilder stringedData = new StringBuilder();
  for (int i = 0; i < list.Count; i++)
  {
    stringedData.Append(list[i] + ", ");
  }
  return stringedData.ToString();
}

мои намерения состояли в том, чтобы преобразовать запрос "имя"перечислить и затем отправить его в CreateString (), чтобы преобразовать его в одну длинную каскадную строку.

Я пытался использовать .Aggregate ((current, next) => current + "," + next);но когда я пытаюсь преобразовать свой запрос в DataTable, как показано ниже:

public DataTable ToDataTable(Object query)
{
  DataTable dt = new DataTable();
  IDbCommand cmd = dc.GetCommand(query as IQueryable);
  SqlDataAdapter adapter = new SqlDataAdapter();
  adapter.SelectCommand = (SqlCommand)cmd;
  cmd.Connection.Open();
  adapter.Fill(dt);
  cmd.Connection.Close();
  return dt;
}

я получаю исключение, что dc.GetCommand () "не может понять запрос с помощью метода Aggregate, позже я даже попытался использовать этопростой запрос:

var resultTable = from itemin dc.table
                    select new
                    {
                      name = CreateString()
                    };

Когда CreateString () возвращает «success», ничего не вставляется в «name», почему нет способа использовать методы в предложении select?Спасибо, Йотам

Ответы [ 2 ]

1 голос
/ 19 июня 2011

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

Что вы можете сделать, это извлечь данные из базы данных, а затем выполнить форматирование, используя LINQ для объектов:

var data = from item in dc.table
           where /* some condition */
           select item;

var result = from item in data.AsEnumerable()
             select new
             {
                 name = SomeFunction(item)
             }

Метод расширения AsEnumerable() форсирует обработку с использованием LINQ для объектов.

0 голосов
/ 14 августа 2011

Простите, если я пропустил, истолковал ваш вопрос.Кажется, что вы пытаетесь абстрагировать ваш метод select для повторного использования.Если это так, вы можете рассмотреть проекцию, используя лямбда-выражение.Например:

internal static class MyProjectors
{
    internal static Expression<Func<Object1, ReturnObject>> StringDataProjector
    {
        get
        {
            return d => new Object1()
            {
                //assignment here
            }
        }
    }
}

Теперь вы можете выбрать свои наборы данных следующим образом:

dc.Table.Select(MyProjectors.StringDataProjector)

Что касается логики конкатенации, как насчет выбора некоторого базового класса со свойством IEnumerable<string> исвойство только для чтения для обработки конкатенации строки?

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