Visual studio 2008 获取具有特定子元素集的项(高级查询-可能吗?)
我有一个SQL数据库(SQL Server 2008),其中包含以下设计 项目Visual studio 2008 获取具有特定子元素集的项(高级查询-可能吗?),visual-studio-2008,linq,linq-to-sql,.net-3.5,Visual Studio 2008,Linq,Linq To Sql,.net 3.5,我有一个SQL数据库(SQL Server 2008),其中包含以下设计 项目 ID(Int,Identity) 姓名(NVarChar(50)) 说明(NVarChar(200)) 元 ID(Int,Identity) 姓名(NVarChar(50)) 这两者之间存在N-N关系,即一个项目可以包含零个或多个元引用,并且一个元可以与多个项目关联。每个元只能与同一项关联一次。这意味着我把经典的桌子放在中间 ITEMMETA ItemID(Int) MetaID(Int) 我想执行一个L
- ID(Int,Identity)
- 姓名(NVarChar(50))
- 说明(NVarChar(200))
- ID(Int,Identity)
- 姓名(NVarChar(50))
- ItemID(Int)
- MetaID(Int)
- 汽车
- 福特
- 越野
- 我将有一个元标记列表,我想用它来过滤将返回的项目(例如,在上面的例子中,我有车、福特和越野车)
- 与我在匹配中提供的项目相比,一个项目可以有更多的元项目与之关联,即如果一个项目关联了Car、Ford、Offroad和Red,那么在过滤器中提供它们的任何组合都会导致匹配
- 但是,筛选器中提供的所有元名称必须与要在结果集中返回的项相关联。所以送车、福特、越野和红色不应该是一个与汽车、福特和越野(无红色)相关的项目的匹配
谢谢大家! 这将返回与任何元标准匹配的任何内容,然后将其筛选为仅与所有标准匹配的内容。(另外,请记住,您需要在datacontext中定义关系)。如果您需要澄清,请告知我们
var db = new YourDataContext();
var possibleItems = (from m in db.Metas where <meta criteria> select m.ItemMetas.Item);
var items = possibleItems.GroupBy(y=>y).Where(x=>x.Count() == criteriaCount).Select(x=>x.Key);
var db=newyourdatacontext();
var possibleItems=(从db.Metas中的m开始,其中选择m.ItemMetas.Item);
var items=possibleItems.GroupBy(y=>y)。其中(x=>x.Count()==criteriaCount)。选择(x=>x.Key);
您可以通过计算过滤后的图元来过滤项目
List<string> metaList = new List<string>() { "Car", "Ford", "Offroad" };
int metaListCount = metaList.Count;
List<Item> result =
db.Items
.Where(i => metaListCount ==
i.ItemMeta.Meta
.Where(m => metaList.Contains(m.Name))
.Count()
)
.ToList();
List metaList=new List(){“汽车”、“福特”、“越野”};
int metaListCount=metaList.Count;
列表结果=
db.项目
.其中(i=>metaListCount==
i、 元,元
.Where(m=>metaList.Contains(m.Name))
.Count()
)
.ToList();
请注意,内存中的此集合有一个上限。包含由SqlServer的参数限制强加的内容(我不记得是~200或~2000)。这应该适用于您:
string[] criteria = new[] { "Car", "Ford", "Offroad" };
var items =
from i in db.Item
let wantedMetas = db.Meta.Where(m => criteria.Contains(m.Name))
let metas = i.ItemMeta.Select(im => im.Meta)
where wantedMetas.All(m => metas.Contains(m))
select i;
基本上,它将“想要的”图元与每个项目的图元进行比较,并选择具有所有想要的图元(或更多)的项目。谢谢,但我希望尽可能避免将数据返回给客户端,然后这些数据将被丢弃,也就是说,客户端过滤是我想要避免的事情,因此我不必使用超过必要的带宽。我将查询分为两个部分,“可能项”和“项”,但实际上,在开始枚举“项”之前,数据库永远不会被命中,只会命中您想要的确切内容。如果您使用Linq,您应该知道“延迟执行”