1

我有一个包含IDGUIDName的UserObject Age。我的函数获取仅包含 ID 和 GUID 的对象列表,并且需要返回与参数匹配的 UserObject(s)。例如:

userIds = new [] {
    { ID = 1, GUID = "AAAAAA" },
    { ID = 2, GUID = "AAAAAB" },
};

var result = from user in session.Query<UserObject>()
             where userIds.Any(u => u.ID == user.ID && u.GUID == user.GUID)
             select user;

UserObjects只有ID存在且GUID匹配时,查询才会返回。问题是 NHibernate 不支持 Any 方法。如何做到这一点?

4

2 回答 2

0

如何遍历传入的对象,为每条记录添加析取。

var c = session.CreateCriteria<User>();
var disjunction = new Disjunction();
foreach (var ids in userIds)
{
    var q = new Conjunction().Add(Restrictions.Eq("userId", ids.userId))
            .Add(Restrictions.Eq("GUID", ids.GUID));
    disjunction.Add(q); 
}
c.Add(disjunction);

对不起,如果代码没有像编写的那样编译并且根本没有经过测试,因为我现在远离 VS。代码也可以写得更简洁。代码实际上是在生成“Select * from Users where ((userId = userId1 and GUID = Guid1) or(userId = userId2 and GUID = GUID2) or....)”类型的查询你在找。

于 2013-05-14T14:03:51.567 回答
0

我相信 NHiberante 不支持Any未映射数组 ( userIds) 上的运算符。

你可以尝试使用,

var result = session.Query<UserObject>()
                    .Where(user => userIds.Select(u => u.ID).Contains(user.ID))
                    .Where(user => userIds.Select(u => u.GUID).Contains(user.GUID))
                    .SingleOrDefault();

this相关答案所示。

于 2013-05-14T13:27:39.730 回答