我有这个Lookup按Symbol分组ResultId.我在下面有Linq查询,但我不能通过使用Contain()来创建SQL IN语句,这是由这篇文章http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to -sql
// This will group ResultIds (Guid) by their symbol (string).
var asd = ResultIdsAndSymbols.ToLookup(x => x.Symbol, y => y.ResultID);
foreach (var qwe in asd)
{
var Numbers = (from t in Session.Query<TableName>()
where qwe.Contains(t.ResultID)
select t.Number).ToList();
}
Run Code Online (Sandbox Code Playgroud)
更新:
重试此代码并深入分析错误(System.InvalidCastException:Object必须实现IConvertible)后,我收到了这条信息性错误消息:"无法将参数值从分组转换为Guid".qwe是一种类型的IGrouping<string, Guid>,它将成为IEnumerable<Guid>不应该是一个问题,如我们将其传递给List构造函数或在foreach语句中使用.抛出的异常System.Data.SqlClient.我认为NHibernate只是将Grouping<TKey, TElement>sql参数传递给导致错误的sql参数.应该将NHibernate设计为枚举到任何IEnumerable<T>并生成SQL IN查询,就像它的用途一样List<T>.
的List<T>,[]数组,Stack做工精良.所以我将代码更改为:
where qwe.ToList().Contains(t.ResultID)
Run Code Online (Sandbox Code Playgroud)
更新:已 报告问题:https://nhibernate.jira.com/browse/NH-2762
在IN子句中,NHibernate LINQ提供程序是有限的.它似乎只适用于T是简单类型的集合,例如List<string>或List<int>.
这适用于NHibernate 3.1(未在早期版本中测试):
var asd = ResultIdsAndSymbols.ToLookup(x => x.Symbol, y => y.ResultID);
foreach (var qwe in asd)
{
List<int> list = qwe.ToList();
var Numbers = (from t in Session.Query<TableName>()
where list.Contains(t.ResultID)
select t.Number).ToList();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4293 次 |
| 最近记录: |