带有lambda的Linq to Entities Select子句

时间:2011-09-02 16:14:44

标签: entity-framework linq-to-entities

我正在开发一个新项目,我们正在使用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,这样我们就可以得到不同的记录。

非常感谢任何帮助。

谢谢,

朗达

2 个答案:

答案 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_idvendors[0].vendor_name等等。