#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 — это коллекция, и вы просто присваиваете верхнее значение? Если вы помещаете их в одну строку, то вам нужно объединить их вместе.