我有两个类(Request&RequestDetail).我需要Linq To NHibernate通过join在两个类之间进行查询.
var q = SessionInstance.Query<Request>()
.Where(x => x.State == "Init");
var q2 = SessionInstance.Query<RequestDetail>();
q2 = q2.Where(xx => xx.Purpose.Contains("Purpose Sample")); // This line has a error When execution ??`q.ToList()?`
q = q.Join(q2, request => request.Id, detail => detail.Id, (request, detail) => request);
return q.ToList();
Run Code Online (Sandbox Code Playgroud)
当我添加Where条件时q2,Result有一个运行时错误.异常消息是:Specified method is not supported.
堆栈跟踪 :
at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)
at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode tree)
at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process()
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor …Run Code Online (Sandbox Code Playgroud) 调用以下代码中的Get工作正常:
public class ContractService : IContractService
{
private readonly IRepository<Contract> repository;
public ContractService(IRepository<Contract> repository)
{
this.repository = repository;
}
public Contract Get(int contractId)
{
return repository.Query().Where(x => x.Id == contractId).FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时:
public class ContractService : CRUDService<Contract>, IContractService
{
public ContractService(IRepository<Contract> repository) : base(repository)
{
}
}
public class CRUDService<TEntity> : ICRUDService<TEntity> where TEntity : IEntity
{
protected readonly IRepository<TEntity> repository;
public CRUDService(IRepository<TEntity> repository)
{
this.repository = repository;
}
public TEntity Get(int id)
{
var entities = this.repository.Query().Where(s => s.Id …Run Code Online (Sandbox Code Playgroud) 有人知道使用NHibernate.Linq批量NHibernate查询的方法,就像你可以使用MultiCriteria和ICriteria对象一样吗?
使用MultiCriteria,我可以创建这样的东西:
var crit = session.CreateMultiCriteria()
.Add(session.CreateCriteria(typeof(Entity1)).Add(Restrictions.Eq("Property1","Value"))
.Add(session.CreateCriteria(typeof(Entity2)).Add(Restrictions.Eq("Property2","Value2"));
var result = crit.List();
var list1 = (IList)result[0];
var list2 = (IList)result[1];
Run Code Online (Sandbox Code Playgroud)
如果我用Linq调用替换CreateCriteria调用并获得如下内容将会很好:
var crit = session.CreateMultiCriteria()
.Add(session.Linq<Entity1>().Where(x => x.Property1 == "Value1")
.Add(session.Linq<Entity2>().Where(x => x.Property2 == "Value2");
var result = crit.List();
var list1 = (IList<Entity1>)result[0];
var list2 = (IList<Entity2>)result[1];
Run Code Online (Sandbox Code Playgroud)
我们在大多数其他查询中使用Linq API,当我们需要运行MultiCriteria查询时,使用相同的Linq语法会很好.
谢谢.
我正在考虑在即将到来的项目中使用Linq到NHibernate,所以我想要一些关于它的反馈.我在2月份发现了这个相同的问题,看来Linq对NHibernate目前还不是很成熟......从那以后它有所改善吗?有没有人在现实生活中使用它?
感谢您的反馈意见
PS:请不要关闭重复:现有问题差不多1岁,我问的是产品的当前状态......
能不能让我知道C#中延迟执行和延迟评估之间的确切差异是什么?这两个是同义词使用的.可以用一个例子解释一下这个区别吗?
任何人都可以帮我弄清楚我做错了什么.我是nhibernate的新手,我发现很难真正适应它.我有这个问题:
var results2 = (from purchase in _session.Query<Purchase>()
group purchase by new { purchase.symbol } into purchases
select new Quote()
{
shares= purchases.Sum(p => p.shares)
}).ToList();
Run Code Online (Sandbox Code Playgroud)
但我得到notsupportedexception并且错误消息只是newexpression.
我们正在使用NHibernate开始一个新项目,并考虑使用NHibernate.Linq(3.0中的嵌入式版本,而不是contrib项目).我知道这是一个相对较新的补充.有没有人使用当前的LINQ for NHibernate?它对于真实世界的应用程序是否足够成熟?
具体而言,您是否遇到过困难,性能如何,是否存在导致您出现问题的支持方面的任何重大差距?
谢谢!
我有一个linq对NHibernate的查询.
var q = SessionInstance.Query<Request>().Max(e => e.Code);
Run Code Online (Sandbox Code Playgroud)
如果Request表没有行,则执行此查询会引发GenericADOException并显示以下消息:
{"Could not execute query[SQL: SQL not available]"}
{"Value cannot be null.\r\nParameter name: item"}
我该怎么办?
我有这样的声明:
var vals =
from StandAloneUserPayment saup in _Session.Query<StandAloneUserPayment>()
.Fetch(x => x.RecurringPayments)
where
saup.User.UserId == userId
&& searchString.Contains(saup.FriendlyName, StringComparer.InvariantCultureIgnoreCase)
select
saup;
Run Code Online (Sandbox Code Playgroud)
这似乎正是我应该做的,但是我Contains用下面的消息下划线方法得到整行:
string不包含定义,Contains并且最好的扩展方法重载System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)有一些无效的参数
我究竟做错了什么?
我遇到了NHibernate 3.3.3针对SQL Server的问题,使用NVARCHAR作为参数来反对从LINQ表达式中的函数创建VARCHAR的LIKE查询的列string.Contains().我有Fluent映射告诉NHibernate该列是VARCHAR,并且基本的"=="比较确实使用了一个VARCHAR参数.
可能的答案在Lambda字符串中列为VARCHAR,但经过多次输入(无法复制/粘贴到我的开发环境中)后,我无法获得任何答案.
这是一个存储VARCHAR列的表:
CREATE TABLE Names (
Id INT NOT NULL IDENTITY (1, 1) PRIMARY KEY,
Name VARCHAR(20) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
以下是一些代码snipets来说明正在发生的事情:
public class Names
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
public class NamesMap : ClassMap<Names>
{
Table("Names");
Id(x => x.Id).Column("Id").GeneratedBy.Identity();
Map(x => x.Name).Column("Name").CustomType("AnsiString");
}
// _namesRepository is an IQueryable …Run Code Online (Sandbox Code Playgroud)