Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 带有lambda的Linq to Entities Select子句_Entity Framework_Linq To Entities - Fatal编程技术网

Entity framework 带有lambda的Linq to Entities Select子句

Entity framework 带有lambda的Linq to Entities Select子句,entity-framework,linq-to-entities,Entity Framework,Linq To Entities,我正在从事一个新项目,我们正在使用实体框架,开发负责人希望尽可能使用lambda查询。有一件事我们很难弄清楚,那就是如何专门选择两列。还有如何选择不同的。我们有一个表,其中包含一个供应商的多个条目,但我们只想获得一个供应商列表并加载到一个dictionary对象。它失败是因为它试图添加一个已经添加的键值。以下面的查询为例 Dictionary<int, string> dict = new Dictionary<int, string>(); dict =

我正在从事一个新项目,我们正在使用实体框架,开发负责人希望尽可能使用lambda查询。有一件事我们很难弄清楚,那就是如何专门选择两列。还有如何选择不同的。我们有一个表,其中包含一个供应商的多个条目,但我们只想获得一个供应商列表并加载到一个dictionary对象。它失败是因为它试图添加一个已经添加的键值。以下面的查询为例

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);
Dictionary dict=new Dictionary();
dict=GetWamVendorInfo().AsEnumerable()
.Where(x=>x.vendor\u name!=null&&x.vendor\u id!=null)
//.Select(x=>x.vendor\u id).Distinct()
.采取(2)
.ToDictionary(o=>int.Parse(o.vendor\u id.ToString()),o=>o.vendor\u name);
我想做的是只选择vendor\u id和vendor\u name,这样我们就可以得到不同的记录

任何帮助都将不胜感激

谢谢


朗达

只需使用匿名对象:

var vendors = GetWamVendorInfo().AsEnumerable()
                .Where(x => x.vendor_name != null && x.vendor_id != null)
                .Select(new {x.vendor_id, x.vendor_name})
                .Take(2)
就这样。您现在可以使用
供应商[0]。供应商id
供应商[0]。供应商名称
,等等。

使用匿名类型:

// 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
的解析,我本来希望它已经是一个整数类型

请注意,您几乎肯定应该从查询中删除
aseneumerable
调用-目前您将获取所有供应商并使用LINQ to对象进行过滤。创建一个空字典然后完全忽略它也是没有意义的。我怀疑您的完整查询应该是:

var vendors = GetWamVendorInfo()
                      .Select(x => new { VendorId = x.vendor_id,
                                         VendorName = x.vendor_name } )
                      .Distinct()
                      .ToDictionary(o => o.VendorId,
                                    o => o.VendorName);

另一方面,您应该询问您的开发负责人,他为什么要在任何地方使用lambda表达式(可能与查询表达式相反)。不同情况下,使用不同语法选项的代码更具可读性-这是值得灵活处理的。

我刚刚测试了我的代码,因为我知道前两个有不同的键。.Distinct似乎仍然不起作用,因为我得到了具有相同vendorId的多条记录。我想我还应该提到vendorId不是这个表的主键,所以有些是空的,有些是重复的(为什么我需要选择distinct)。另外,vendorId是一个长字符串。@Rhonda:它只会被所有属性区分开来——换句话说,如果您有两个ID相同但名称不同的记录,它们是不同的,因此都将被返回。如果供应商ID是长的,为什么要将其转换为int?为什么不把它留长一点呢?这种转换可能只是尝试多种方法使下拉列表显示正确值的结果。事实证明,它长时间运行似乎很好。我们试图使用的数据的真实性是垃圾。很多供应商都有相同的id,但名称略有不同,具体取决于从哪个系统提取。这必须首先解决。然后代码就可以工作了。谢谢你的帮助。