NHibernate Linq:包含Statement

时间:2010-07-19 13:47:57

标签: c# linq nhibernate

举个例子,假设你有一个像这样的课程

**Person**
int PersonID
string PersonName
BusinessLocation Locations

**BusinessLocation**
string city
string state
List<int> ZipCodes

(说这些位置可能存在多个zipcodes)
(也忽略了zipcodes应该是字符串而不是整数,这只是一个例子)

假设企业的位置存在多个邮政编码。

现在我试图在给出商业邮政编码的情况下撤回人员表中的所有人。

例如,我希望所有邮政编码为32567的人。

(鉴于ID列表,这是有效的,我正在尝试相反,给定一个ID,我想要一个人的列表)

public Person GetPersonsByBusinessZipCode(int zipcode)
{
    List<Person> personList = 
        this.GetAllQueryable().Where(
            x => x.Locations.ZipCodes.Contains(zipcode)).ToList();
}

这是在Fluent中映射的。

HasMany<int>(x => x.ZipCodes)
   .Table("BusinessLocationsZipCodes")
   .KeyColumns.Add("BusinessLocationID")
   .Inverse()
   .Element("ZipCode")
   .AsBag()
   .Cascade.None()
   .Cache.ReadOnly();

BusinessLocationZipCodes只是一个参考表,暗示BusinessLocation可以有多个ZipCodes,因此是HasMany。

知道反向工作,如果给我一个ZipCodes列表,我试图找到包含在zipcodes列表中的BusinessLocations(只要映射是一个zipcode而不是一个zipcodes列表)。现在我只想找到一个邮政编码的商业地点。

如果有人有答案,我将不胜感激。

3 个答案:

答案 0 :(得分:0)

帕克,显然我搞砸了,因为我有两个帐户在这里漂浮,我不知道,所以这是我的OpenID。无论如何我不确定NullReferenceException,它潜入NHibernate命名空间,没有链接回我正在使用的任何类。但是当我尝试使用Contains潜入它时,我只得到NullReferenceException。如上所述,如果我只是带回ZipCodes列表,我就不会得到NullReferenceException。所以我的映射有效,但它似乎无法返回基于Contains语句的BusinessLocations列表。

答案 1 :(得分:-1)

只要您使用System.Linq.Queryable和IQueryable接口,Linq提供程序就不重要了。

我相信您正在寻找Queryable.Any方法。

Persons.Where(p => p.Locations.ZipCodes.Any(z => z == zipCode))

或者,如果您的人员有很多地点:

IQueryable<Person> query =
  from p in Persons
  where
  (
    from l in p.Locations
    from z in l.ZipCodes
    select z
  ).Any(z => z == zipCode)
  select p;

答案 2 :(得分:-1)

有什么例外?这应该可以使用最新的NHibernate版本(2.1.2.400)正常工作。

//以下查询:(不要介意西班牙语)

var transporte = // some entity;
var solicitud  = IQueryable<Solicitud>
                   .Where(x => x.SolicitudesDeTransporte.Contains(transporte)).ToList();

生成:

SELECT this_.Id as Id6_0_,
       /* etc... */
FROM   Solicitud this_
WHERE  this_.Id in (SELECT this_0_.Id as y0_
                    FROM   Solicitud this_0_
                           left outer join Solicitud_Transporte solicitude1_
                             on this_0_.Id = solicitude1_.Id_Solicitud
                    WHERE  solicitude1_.Id = 1 /* :p0 */)