Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 获取具有特定子元素集的项(高级查询-可能吗?)_Visual Studio 2008_Linq_Linq To Sql_.net 3.5 - Fatal编程技术网

Visual studio 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

我有一个SQL数据库(SQL Server 2008),其中包含以下设计

项目
  • ID(Int,Identity)
  • 姓名(NVarChar(50))
  • 说明(NVarChar(200))
  • ID(Int,Identity)
  • 姓名(NVarChar(50))
这两者之间存在N-N关系,即一个项目可以包含零个或多个元引用,并且一个元可以与多个项目关联。每个元只能与同一项关联一次。这意味着我把经典的桌子放在中间

ITEMMETA
  • ItemID(Int)
  • MetaID(Int)
我想执行一个LinqToSql查询来提取包含一组特定元链接的所有条目实体。例如,给我所有与以下元项关联的项

  • 汽车
  • 福特
  • 越野
有可能在LinqToSql的帮助下编写这样的查询吗?让我再提出一些要求

  • 我将有一个元标记列表,我想用它来过滤将返回的项目(例如,在上面的例子中,我有车、福特和越野车)
  • 与我在匹配中提供的项目相比,一个项目可以有更多的元项目与之关联,即如果一个项目关联了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,您应该知道“延迟执行”