context.Listings.Where(l => l.PricePerMonthInUsd < 10e3 && l.SquareMeters >= 200)
.ToList();
所有列表共用一个表,属性类型另有一张表,值(包括清单ID、属性ID)存储在另一张表中(EAV结构):
var listingIds = context.AttributeValues.Where(v =>
v.AttributeTypeId == PricePerMonthInUsdId && v < 10e3)
.Select(v => v.ListingId)
.Intersection(context.AttributeVales.Where(v =>
v.AttributeTypeId == SquareMetersId && v.Value >= 200)
.Select(v => v.ListingId)).ToList();
或:(在实际数据库上比较性能)
var listingIds = context.AttributeValues.Where(v =>
v.AttributeTypeId == PricePerMonthInUsdId && v < 10e3)
.Select(v => v.ListingId).ToList();
listingIds = context.AttributeVales.Where(v =>
listingIds.Contains(v.LisingId)
&& v.AttributeTypeId == SquareMetersId
&& v.Value >= 200)
.Select(v => v.ListingId).ToList();
然后:
var listings = context.Listings.Where(l => listingIds.Contains(l.ListingId)).ToList();
妥协方案 - 一个包含所有列表和一个每个属性组(假设您可以将属性分为组)的值的表:
price -> 1
address -> 2
sqft -> 3
这个表格也将作为枚举类型硬编码到我的代码中,并用于查询。
然后在主表中,我有两个字段一起使用,一个是从上面的表格中获取的字段ID的类型,另一个是它的值,例如
Line1: 122(map id), 1 (for price), 100 (the actually price)
Line2: 122(map id), 2 (for address), "where is it"
Line3: 122(map id), 3 (for sqft), 10 (sqft)
这里的问题是你可能需要至少两个字段,一个用于数字,一个用于字符串。
当然,这只是一个建议。