0

我试图找到一种更优雅的方式将信息从我的数据库中提取到我的 Web 应用程序中。目前我在我的表中提取所有数据并且只使用两列的数据。有人建议我考虑SelectMany()通过仅选择我需要的列来完成此操作。

我不完全确定如何使用 linq-to-sql db 将 msdn 示例转换为 linq 语句。

我目前的声明是这样的:

return db.document_library_sitefiles
         .Where(item => item.SiteID == siteId)
         .Select(item => item.document_library)
         .GroupBy(item => item.Filename)
         .Select(group => group.OrderByDescending(p=>p.Version).First())
         .Where(item => !item.Filename.Contains("*")).ToList();

我目前的尝试,我知道这是错误的,看起来像这样:

return db.document_library_sitefiles
         .Where(item => item.SiteID == siteId)
         .SelectMany(item => item.document_library, (filename, filesize) 
             => new { filename, filesize })
         .Select(item => new { filename = item.document_library.filename, 
                               filesize = item.document_library.filesize })
         .ToList();

我是否距离获得预期结果很近?

基本上我想在我的filenamefilesize列中获取数据,而不需要提取包括file content(不是我的设计或想法)在内的其余数据,所以我不会用不必要的信息淹没我的服务器,只是为了显示当前文件的简单数据表这个分贝。

4

2 回答 2

1

你不能只在你的第一个语句中附加一个选择吗?

....Where(item => !item.Filename.Contains("*"))
    .Select(item => new { 
                            item.Filename, 
                            item.Filesize 
                        }).ToList();
于 2013-05-23T17:58:06.407 回答
1

我认为你正朝着正确的方向前进。看起来您只是以一种不受欢迎的方式更改了第二个查询。试试这个;

return db.document_library_sitefiles
         .Where(item => item.SiteID == siteId)
         .Select(item => item.document_library)
         .GroupBy(item => item.Filename)
         .Select(group => group.OrderByDescending(p=>p.Version).First())
         .Where(item => !item.Filename.Contains("*"))
         .Select( item => new { filename = item.document_library.filename, 
                               filesize = item.document_library.filesize } ).ToList();

基本上,您希望使所有逻辑与第一个查询中的逻辑完全相同,然后再选择一个您初始化匿名对象以返回的选择。

在您尝试查询时,您更改了一些基础逻辑。您希望所有早期操作保持完全相同(否则您返回的结果将来自不同的集合),您只想转换结果集中的对象,这就是您在最终 where 之后添加选择的原因。

于 2013-05-23T17:58:21.407 回答