我们有一个使用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的财产)
答案 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
个实体。