无法从数据库中检索不同的记录?

时间:2013-12-31 16:17:53

标签: c# .net linq-to-sql

我有一个类似下面的数据库表,

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'的属性。

如何解决这个问题?

3 个答案:

答案 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”或之后是吗?