Как получить текст из запроса LINQ2SQL?

#c# #linq #linq-to-sql

#c# #linq #linq-to-sql

Вопрос:

У меня есть веб-страница, на которой я предоставляю ПОЛЬЗОВАТЕЛЮ варианты написания заметок. Теперь, когда веб-страница проверяет, что ПОЛЬЗОВАТЕЛЬ:abc, она извлекает заметку из таблицы MEMO.

Вот мой код в Page_Load():

 using (EntityMemoDataContext em = new EntityMemoDataContext())
            {
                int getEntity = Int16.Parse(Session["EntityIdSelected"].ToString());
                var showMemo = from r in em.EntityMemoVs_1s
                               where r.EntityID == getEntity
                               select r.Memo;

                tbShowNote.Text = String.Join(@"<br />", showMemo);
            }
  

tbShowNote показывает мне значение, подобное этому:

 test<br />test1<br />test1<br />test4<br />test4
  

И я хочу, чтобы это было так:

Тест
Test1
Test2 …

tbShowNote — это текстовое поле!

Комментарии:

1. Как выглядит свойство Memo? Это массив чего-либо, коллекция или даже другой объект / сущность?

2. это столбец в EntityMemoVs_1s : nvarchar(500) в MSSQL2008.

3. Не работает «First()» в showMemo. First().toString(); выдает вам только первое значение? (не уверен, поэтому я спрашиваю, а не отвечаю …)

4. @Cos Callis: Это так. Я хотел бы знать, почему он все равно возвращает коллекцию. Я бы сказал, что nvarchar должен быть сопоставлен с одной строкой.

5. Я не много работал с Linq2SQL, но я думаю, что select превращает его в коллекцию, даже если это коллекция из одного… и сначала просто получает первый элемент. (Вот как я готов ответить @Pete’s)

Ответ №1:

Вы запросили только первую заметку, вот что вы получили в ответ. Если вы хотите, чтобы он перечислялся с каждым в отдельной строке в html, вы могли бы сделать это:

     using (EntityMemoDataContext em = new EntityMemoDataContext())
    {
        int getEntity1 = Int16.Parse(Session["EntityIdSelected"].ToString());
        var showMemo = from r in em.EntityMemoVs_1s
                       where r.EntityID == getEntity1
                       select new
                       {
                           r.Memo
                       };
        tbShowNote.Text = String.Join(@"<br />", showMemo);
    }
  

Ключевой вывод заключается в том, что если r.Memo имеет тип string, то выполненный вами запрос LINQ вернет вам IQueryable<string> . Вам решать, хотите ли вы позже выровнять этот список.

Редактировать: Equiso сделал хорошее замечание в том смысле, что вы фактически возвращаете значение IQueryable анонимного типа, а не IQueryable<string> из-за new { ... } синтаксиса. Я бы сказал, объединить его ответ с моим и запустить с ним:

 var showMemo = from r in em.EntityMemoVs_1s
               where r.EntityID == getEntity1
               select r.Memo;

tbShowNote.Text = String.Join(@"<br />", showMemo);
  

Ответ №2:

Проблема в select части вашего запроса linq, вы обертываете свои результаты в анонимный тип, поэтому при вызове ToString() вы видите { Memo = test } . Вы, вероятно, хотите, чтобы это было так:

 var showMemo = from r in em.EntityMemoVs_1s
               where r.EntityID == getEntity1
               select r.Memo;
  

После этого showMemo будет содержать только строки.

Ответ №3:

Похоже, что ваш showMemo — это коллекция, и вы просто присваиваете верхнее значение? Если вы помещаете их в одну строку, то вам нужно объединить их вместе.