在这样的查询中:
var q = from l in session.Linq<Letter>()
where
letterTypeSearch == null ? true :
(l.LetterType.ToString() == letterTypeSearch)
l.LetterType是一个枚举。
更新
似乎无法比较当前linq-to-nhibernate中的Enums。虽然letterTypeSearch是一个包含LetterType
实例并且ToString()
继承自LetterType
的字符串的字符串,但还有3种比较方法:
1-在int
中进行比较:这是不可能的,因为String
生成“(ArgumentOutOfRangeException):索引超出范围。必须是非负数且小于集合的大小。
参数名称:index,“error。
2-在l.LetterType.ToString()
(Enum
)中进行比较:这也是不可能的,因为LetterType
导致“(QueryException):NHibernate.Criterion.SimpleExpression中的类型不匹配:LetterType预期类型System.Int32,实际类型Faraconesh.EnterpriseAppUnits.OfficeAutomation.BusinessEntities.LetterType,
“错误。
3-在l.LetterType == LetterType.Internal
中进行比较:但不可能,因为Int32
生成“(NotImplementedException):未实现ToInt32方法。”错误。
那么如何在LINQ-to-NHibernate中比较枚举?这个问题特定于LINQ-to-NHibernate还是所有LINQ用户都有这样的问题?
UPDATE2 这里是类,枚举和映射(smmarized):
Convert.ToInt32(l.LetterType)
======
public enum LetterType { 传入= 0, 传出= 1, 内部= 2, }
======
public class Letter
{
private LetterType _letterType;
public LetterType LetterType
{
set
{
_letterType = value;
}//end
get
{
return _letterType;
}//end
}
}
答案 0 :(得分:1)
您已将枚举映射为type="int"
导致错误,可能是因为没有与int之间的隐式转换。如果删除type属性,枚举将映射到数据库中的int值,Linq查询将起作用。
另请注意,在属性映射中,除了名称和类型之外的每个属性都是不必要的,因为它们指定了默认值。 “名称”是属性映射中唯一必需的属性,请参阅参考文档中的property部分。
<property name="LetterType" />
使用最新的(2.1.2GA)版本的NHibernate.Linq,可以从nhforge.org上的 NHibernate Core 下载链接获得,以下带枚举的查询按预期工作。< / p>
var q = from l in session.Linq<Letter>()
where l. LetterType == LetterType.A4
select l;
var result = q.ToList<Letter>();
LetterType? ltype = LetterType.A4;
q = from l in session.Linq<Letter>()
select l;
if (code != null) {
q = q.Where( l => l.LetterType == ltype.Value );
}
result = q.ToList<Letter>();
但是,如果ltype为null,则最后一个查询的这种形式将不起作用,因为查询解析器仍会尝试使用ltype.Value。
q = from l in session.Linq<Letter>()
where ltype != null && l => l.LetterType == ltype.Value
select l;
result = q.ToList<Letter>();
答案 1 :(得分:0)
如果我是你,我用这些nhibernate Enum创建一个Dot net Enum,然后将它们与dot net equals进行比较。