我在看起来非常简单的QueryOver时遇到错误。复杂的是,select涉及CompositeId。
我得到的错误是:
System.InvalidOperationException:类型的变量'x' 'nha.cs.utility.mole.QueryParameters'来自范围'',但它 没有定义。
我正在映射具有许多查询参数的查询。复合id带有查询和查询参数名称,如下所示。
public class Query
{
public virtual int id { get; protected set; }
public virtual string name { get; set; }
public virtual string query { get; set; }
public virtual IList<QueryParameters> parameters { get; set; }
public virtual IList<Application> applicationsUsedIn { get; set; }
public Query()
{
this.parameters = new List<QueryParameters>();
this.applicationsUsedIn = new List<Application>();
}
public virtual void AddParameter(QueryParameters qp)
{
qp.query = this;
this.parameters.Add(qp);
}
}
public class QueryParameters
{
public virtual Query query { get; set; }
public virtual string name { get; set; }
public virtual string type { get; set; }
public virtual int order { get; set; }
public QueryParameters()
{
}
public QueryParameters(Query qry, string nm)
{
this.query = qry;
this.name = nm;
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
var t = obj as QueryParameters;
if (t == null)
return false;
if (query == t.query && name == t.name)
return true;
return false;
}
public override int GetHashCode()
{
return (query.id + "|" + name)).GetHashCode();
}
}
public QueryMap()
{
Table("dbo.Queries");
Id(x => x.id);
Map(x => x.name);
Map(x => x.query);
HasMany(x => x.parameters)
.Cascade.All()
;
HasManyToMany(x => x.applicationsUsedIn)
.Table("dbo.ApplicationsQueries")
.ParentKeyColumn("qryid")
.ChildKeyColumn("appid")
.Inverse()
.LazyLoad();
}
public QueryParametersMap()
{
Table("dbo.QueryParameters");
CompositeId()
.KeyReference(x => x.query)
.KeyProperty(x => x.name)
;
References(x => x.query).Column("qryid").Not.Insert();
Map(x => x.name);
Map(x => x.order);
Map(x => x.type);
}
public Query addParameterToQuery(Query qry, string paramname, string paramtype, int paramorder)
{
if (null != qry)
{
string qryname = qry.name;
string qrystr = qry.query;
using (ISessionFactory isf = getSessionFactory())
{
using (var sess = isf.OpenSession())
{
using (var tran = sess.Transaction)
{
try
{
tran.Begin();
var critqry = sess.CreateCriteria<Query>()
.Add(Restrictions.Eq("name", qryname));
Query qryd = (Query)critqry.UniqueResult();
if (null == qryd)
{
qryd = new Query();
qryd.name = qryname;
qryd.query = qrystr;
sess.Save(qryd);
Console.Out.WriteLine("Query was null, added new query with name '" + qryname + "'");
}
else
{
Console.Out.WriteLine("Query was not null, has name '" + qryname + "'");
}
//EXCEPTION THROWN ON THIS LINE BELOW
var cp = sess.QueryOver<QueryParameters>()
.Select(x => x.query == qryd, x => x.name == paramname);
QueryParameters qryparam = cp.List().First<QueryParameters>();
}
catch (Exception ex)
{
tran.Rollback();
lws.logMessage(AppName, "addParameterToQuery", ex.ToString(), MessageType.Info, MessageLevel.Error);
Console.Out.WriteLine(ex.ToString());
}
}
}
}
}
return (null);
}
任何想法或指示都将不胜感激。
谢谢,
布鲁斯。
更新代码
public class QueryMap : ClassMap<Query>
{
public QueryMap()
{
Table("dbo.Queries");
Id(x => x.id);
Map(x => x.name);
Map(x => x.query);
HasMany(x => x.parameters)
.Cascade.All()
.KeyColumn("qryid");
HasManyToMany(x => x.applicationsUsedIn)
.Table("dbo.ApplicationsQueries")
.ParentKeyColumn("qryid")
.ChildKeyColumn("appid")
.Inverse()
.LazyLoad();
}
}
public class QueryParametersMap : ClassMap<QueryParameters>
{
public QueryParametersMap()
{
Table("dbo.QueryParameters");
Id(x => x.id);
References(x => x.query).Column("qryid").Not.Insert();
Map(x => x.name);
Map(x => x.type);
Map(x => x.order).Column("ordr");
}
}
var cp = sess.QueryOver<QueryParameters>()
.Where(x => x.query.id == qryd.id)
.And(x => x.name == paramname);
答案 0 :(得分:1)
一个问题是使用.Select()
作为过滤部分。使用QueryOver
时,我们必须改为使用.Where()
:
var cp = sess.QueryOver<QueryParameters>()
//.Select(x => x.query == qryd, x => x.name == paramname)
.Where(x => x.query.Id == qryd.ID)
.And(x => x.name == paramname)
.List<QueryParameters>();
见16.2. Simple Expressions。 .Select()
可以缩小结果集,因为它的定义将用于创建SELECT子句:16.6. Projections
要将更多相关对象/实体包含在查询中,我们可以使用16.4. Associations(即JOIN相关表格)
注意:Bruce,如果可能的话,我会尝试重新思考域模型。多对多和复合id是过度复杂的(如果不是过于复杂)的迹象。在尝试使用异国情调的绘图之前,我尝试了很多次...它是为了传统目的。也许请查看此部分:24. Best Practices