我有一个映射到旧数据库表的实体。我想只使用表中的部分结果作为我的域对象。所以我在映射文件中添加了一个类级别Where子句。 源代码如下:
public MyCustomerBaseMap():ClassMapping<MyCustomerBase>
{
Table("MyCustomerBase");
Mutable(true);
Where("CustomerType = 5");
...
}
代码按预期执行映射,但添加的过滤器 Where customerType = 5 不在生成的SQL中。我尝试使用CustomerizersHoler.AddCustomer方法,但它也没有用。
为了使where子句生效,我还有其他地方需要修改吗?
================= 2012年11月14日更新================= 以下是使用
的查询public IEnumerable<Request> Search(Criteria<Request> criteria, IList<Guid> customerIds)
{
IQueryable<Request> q = from r in Db
where r.State == 0 //active
&& customerIds.Contains(r.MyCustomer.Parent.CustomerId)
select r;
return q.Where(criteria.Predicate);
}
以下是生成的SQL,我修改了一些表和字段名称,但结构保持不变。我的映射代码实际上比我在这里展示的更复杂。
基本上,每个实体都有一个Base表和Extension表。所以有一个MyCustomerBase类和MyCustomer表。 MyCustomerBase是MyCustomer的超类。 Where子句已添加到MyCustomerBase
的映射文件中select TOP (10 /* @p0 */) request0_.RequestId as col_0_0_,
request0_.lastupdate as col_1_0_,
case
when request0_1_.ModifiedOn > request0_.lastupdate then 1
else 0
end as col_2_0_,
request0_.lastupdate as col_3_0_,
request0_1_.ModifiedOn as col_4_0_
from RequestExtension request0_
inner join Request request0_1_
on request0_.RequestId = request0_1_.RequestId
left outer join CustomerExtension mycustomer1_
on request0_1_.CustomerId = mycustomer1_.CustomerId **--where clause?**
left outer join Customer mycustomer1_1_
on mycustomer1_.CustomerId = mycustomer1_1_.CustomerId
where request0_1_.State = 0 /* @p1 */
and (mycustomer1_1_.ParentCustomerId in ('ae030101-26c0-de11-823f-0050569e060b' /* @p2 */))
and (0 /* @p26 */ = 1
or request0_1_.RequestNumber like ('%' + '307' /* @p27 */ + '%'))
and cast(case
when request0_.lastupdate is null
or request0_1_.ModifiedOn > request0_.lastupdate then request0_1_.ModifiedOn
else request0_.lastupdate
end as DATETIME) > '2012-11-13T10:28:32.00' /* @p28 */
案例......因为我传入的标准生成了,这不应该影响结果。