Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
SQL的Linq版本;在;陈述_Sql_Linq_Linq To Sql - Fatal编程技术网

SQL的Linq版本;在;陈述

SQL的Linq版本;在;陈述,sql,linq,linq-to-sql,Sql,Linq,Linq To Sql,作为简单“项目标记”模式的一部分,我有以下3个表: ==项目== ItemId int 瓦查尔品牌 名称varchar 标价 条件varchar 描述varchar 活动钻头 ==标签== 塔吉德整数 名称varchar 活动钻头 ==标记映射== TagMapId int TagId int(fk) ItemId int(fk) 活动钻头 我想编写一个LINQ查询,以返回与标记列表匹配的项(例如,TagId=2,3,4,7)。在我的应用程序上下文中,项目的示例为“计算机监视器”、“

作为简单“项目标记”模式的一部分,我有以下3个表:

==项目==

  • ItemId int
  • 瓦查尔品牌
  • 名称varchar
  • 标价
  • 条件varchar
  • 描述varchar
  • 活动钻头
==标签==

  • 塔吉德整数
  • 名称varchar
  • 活动钻头
==标记映射==

  • TagMapId int
  • TagId int(fk)
  • ItemId int(fk)
  • 活动钻头
我想编写一个LINQ查询,以返回与标记列表匹配的项(例如,TagId=2,3,4,7)。在我的应用程序上下文中,项目的示例为“计算机监视器”、“连衣裙衬衫”、“吉他”等,标记的示例为“电子产品”、“服装”等。我通常会使用SQL In语句来完成此操作。

给定的项目数组:

var list = new int[] {2,3,4}
使用:

差不多

var TagIds = new int[] {12, 32, 42};

var q = from map in Context.TagMaps 
        where TagIds.Contains(map.TagId)
        select map.Items;
你应该做你需要的。这将生成一个In(12,32,42)子句(如果我没有弄错的话,更具体地说是一个参数化的In子句)。

List tagIds=new List(){2,3,4,7};
int tagIdCount=tagIds.Count;
//
//具有任何标记的项目
//(任何物品可能有任何标签,但不一定全部都有。)
//
var ItemsAnyTags=db.Items
.Where(item=>item.TagMaps
.Any(tm=>TagId.Contains(tm.TagId))
);
//
//具有所有标记的项目
//(任何项目可能有未提及的额外标签)。
//
var ItemIdsForAllTags=db.TagMap
.Where(tm=>TagId.Contains(tm.TagId))
.GroupBy(tm=>tm.ItemId)
.Where(g=>g.Count()==tagIdCount)
.选择(g=>g.Key);
//
var ItemsWithAllTags=db.Items
.Where(item=>ItemsIdsForAllTags.Contains(item.ItemId));
//仅对数据库运行一个查询
列表结果=Itemswithaltags.ToList();
您只需使用

var TagIds = {12, 32, 42}
var prod =entities.TagMaps.Where(tagmaps=> TagIds .Contains(tagmaps.TagId));

您可以创建扩展方法“IN()”

像这样使用

var q = from map in Context.TagMaps 
        where map.TagId.IN(2, 3, 4, 7)
        select map.Items;
或者只使用内联数组。Contains()表示法:

var q = from map in Context.TagMaps 
        where new[]{2, 3, 4, 7}.Contains(map.TagId)
        select map.Items;

我不明白在我拥有的3表模式下如何工作。它通过select map.Item部分发挥作用。在SQL中,您必须将标记映射连接到项表。Linq为您这样做是因为标记映射与项之间的关系。您本质上是说“查找引用我的任何标记ID的所有标记映射,并将其项返回给我”。此Linq查询与以下SQL相同:从item.ItemId=TagMap.ItemId的标记映射内部连接项中选择项。*,其中TagMaps.TagId位于(12,32,24)Linq为您负责内部连接部分,因为它知道如何从标记映射到项目。为什么这里不首选内部连接?您知道如果
上下文.TagMaps
包含10条记录,它将在后台迭代36次,而不管是否有匹配。数组声明不太正确。将这个答案与下面@LukeSchafer的答案结合起来,它就会起作用。为什么这里不推荐使用内部连接?您知道,如果Context.TagMaps包含10条记录,它将在后台迭代36次,而不管是否存在匹配。您可能会发现它很有用。这是一个用LINQ表示的常见SQL查询列表。
string[] names = {"John", "Cassandra", "Sarah"};

var results = (from n in db.Names
               where names.Contains(n.Name)
               select n).ToList();
public static class Extension
{
    public static bool IN(this object anyObject, params object[] list)
    { return list.Contains(anyObject); }
}
var q = from map in Context.TagMaps 
        where map.TagId.IN(2, 3, 4, 7)
        select map.Items;
var q = from map in Context.TagMaps 
        where new[]{2, 3, 4, 7}.Contains(map.TagId)
        select map.Items;