我有一个类似下面的数据库表,
ID Author Book
1 Kate Smuggler
2 Harper Smuggler
3 Slater Smuggler
4 Kate Katy
5 Smitha Katy
我想根据作者姓名检索所有图书名称(Distinct)并在列表视图中显示它们,我写下面的代码来检索不同的值
int UserID = Convert.ToInt32(Session["User"]);
var Li = (from s in Data.TableName where s.Author == UserID select s.Book).Distinct().OrderBy(ID=>ID);
ListViewChatList.DataSourceID = "";
ListViewChatList.DataSource = Li;
ListViewChatList.DataBind();
但是我得到以下错误'System.String'不包含名为'ID'的属性。
如何解决这个问题?
答案 0 :(得分:2)
这部分:
select s.Book
只选择记录的书(标题)部分。你不能从那里回到ID ...根据你的样本数据,同一个标题很容易有多个ID。
目前还不清楚你要求该查询返回什么,因为你正在获得不同的书标题 - 忽略作者,你想要ID 1和4吗? 2和5? 3和5?两者都代表同一组不同的头衔(Smuggler和Katy)。
您可以按名称分组,然后使用共享名称对书籍的ID执行任何操作 - 但您确实需要考虑清晰度标准对结果的意义。< / p>
这是一个查询,它将为您提供每个名称的最低ID:
var query = from s in Data.TableName
where s.Author == UserID
group s.ID by s.Book into g
select g.OrderBy(id => id).First();
目前尚不清楚这是否是你真正需要的。
答案 1 :(得分:0)
var Li = from s in Data.TableName
where s.Author == User
orderby s.ID
select s.Book;
答案 2 :(得分:0)
您只是选择Book
列(字符串),然后尝试按ID
排序,您无法再访问该列,而且当然不属于本书的属性字符串。
假设这是您的数据:
ID Author Book
1 Kate Smuggler
2 Kate Smuggler2
3 Kate Smuggler
4 Frey Katy
5 Smitha Katy
如果您执行以下操作,您将获得上面列出的前三本书:
(from s in Data.TableName where s.Author == "Kate" select s.Book);
然后你做了一个独特的,将书籍减少到两个独特的书籍(Smuggler和Smuggler2):
(...).Distinct();
然后您尝试按ID排序,但您最初没有选择它,因此您无法访问它。你已经对结果进行了Distinct
,所以你已经失去了一些细节。
由于两本“走私者”书籍已减少为一本,但他们的身份证分别为1和3 (在我的例子中),他们应该怎么做?单个“Smuggler”书籍之前“Smuggler2”或之后是吗?