使用lambda表达式从对象集合中选择不同的对象

时间:2010-07-27 13:31:12

标签: linq nhibernate lambda repository

我们有一个使用Fluent NHibernate的项目。有一个名为BluePart的对象,其属性为Oem类型的Oem。

public class BluePart : DomainEntity
{
    ...
    public virtual Oem Oem { get; set; }
}

Oem对象有几个属性,包括OemCode和OemDescription。

public class Oem : DomainEntity
{
    ...
    public virtual string OemCode { get; set; }
    public virtual string OemDescription { get; set; }
}

我正在尝试使用lambda表达式构建一个linq查询,该表达式将从BlueParts列表中获取所有不同的Oems(270万条记录)。理想情况下,它应该生成以下sql(运行在< 1sec):

select distinct o.OemCode, o.OemDescription 
From BluePart b inner join Oem o on o.OemId = b.Oem_id

以下是我建立的查询,它返回所有Oems,无论其区别如何。

var oem = repository.Query<BluePart>().Select(x => new Oem { OemCode =
x.Oem.OemCode, OemDescription = x.Oem.OemDescription}).ToList();

我认为这个查询很容易构建,但事实并非如此。当运行GroupBy(.GroupBy(z =&gt; z.OemCode))时,我不断收到错误,说我尝试GroupBy的属性不是Bluepart的属性(它不应该是因为我正在分组Oem的财产)

1 个答案:

答案 0 :(得分:1)

怎么样:

var oem = repository.Query<BluePart>()
                    .Select(x => new { OemCode = x.Oem.OemCode, 
                                       OemDescription = x.Oem.OemDescription})
                    .Distinct()
                    .ToList();

这将为您提供不同的代码/描述对,但看起来就是您感兴趣的所有内容。

或者,使用分组:

var oem = repository.Query<BluePart>()
                    .GroupBy(x => new { OemCode = x.Oem.OemCode, 
                                        OemDescription = x.Oem.OemDescription})
                    .ToList();

这将为您提供按OEM代码/说明分组的所有BluePart个实体。