我正在尝试找到一种更优雅的方式将信息从我的数据库提取到我的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();
我是否接近取得预期的结果?
基本上我想在我的filename
和filesize
列中获取数据,而不会删除包含file content
的其他数据(不是我的设计或想法)所以我不是用不必要的信息充斥我的服务器只是为了显示当前在这个数据库中的文件的简单数据表。
答案 0 :(得分:1)
你不能只是在你的第一个声明附加一个选择吗?
....Where(item => !item.Filename.Contains("*"))
.Select(item => new {
item.Filename,
item.Filesize
}).ToList();
答案 1 :(得分: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();
基本上,您希望保持所有逻辑与第一个查询中的逻辑完全相同,然后再添加一个选择初始化要返回的匿名对象的选项。
在您尝试查询时,您更改了一些基础逻辑。您希望所有早期操作保持完全相同(否则返回的结果将来自不同的集合),您只想转换结果集中的对象,这就是您在最终位置之后添加选择的原因。