我正在开发一个新项目,我们正在使用Entity Framework,dev开发人员希望尽可能使用lambda查询。我们很难搞清楚的一件事是如何专门选择两列。另外如何选择不同。我们有一个表,它有一个供应商的多个条目,但我们想要获得供应商列表并加载到字典对象。它失败了,因为它正在尝试添加已添加的键值。请执行以下查询。
Dictionary<int, string> dict = new Dictionary<int, string>();
dict = GetWamVendorInfo().AsEnumerable()
.Where(x => x.vendor_name != null && x.vendor_id != null)
//.Select(x => x.vendor_id).Distinct()
.Take(2)
.ToDictionary(o => int.Parse(o.vendor_id.ToString()), o => o.vendor_name);
我想做的是选择vendor_id和vendor_name,这样我们就可以得到不同的记录。
非常感谢任何帮助。
谢谢,
朗达
答案 0 :(得分:9)
使用匿名类型:
// earlier bit of query
.Select(x => new { VendorId = x.vendor_id, VendorName = x.vendor_name } )
.Distinct()
.ToDictionary(o => o.VendorId, o => o.VendorName);
我已经删除了对Take(2)
的调用,因为不清楚为什么你需要它 - 并且还删除了VendorId
的解析,我本来希望它已经是一个整数类型。
请注意,您几乎肯定会从查询中删除AsEnumerable
调用 - 目前您将获取所有供应商并使用LINQ to Objects进行过滤。创建一个空字典然后完全忽略它也没有意义。我怀疑你的完整查询应该是:
var vendors = GetWamVendorInfo()
.Select(x => new { VendorId = x.vendor_id,
VendorName = x.vendor_name } )
.Distinct()
.ToDictionary(o => o.VendorId,
o => o.VendorName);
顺便说一句,你应该问你的开发人员为什么他想在任何地方使用lambda表达式(可能与查询表达式相对)。不同的情况最终会使用不同的语法选项来获得更易读的代码 - 在这方面值得灵活。
答案 1 :(得分:4)
只需使用匿名对象:
var vendors = GetWamVendorInfo().AsEnumerable()
.Where(x => x.vendor_name != null && x.vendor_id != null)
.Select(new {x.vendor_id, x.vendor_name})
.Take(2)
就是这样。您现在可以使用vendors[0].vendor_id
,vendors[0].vendor_name
等等。