SQL的Linq版本;在;陈述
作为简单“项目标记”模式的一部分,我有以下3个表: ==项目==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)。在我的应用程序上下文中,项目的示例为“计算机监视器”、“
- ItemId int
- 瓦查尔品牌
- 名称varchar
- 标价
- 条件varchar
- 描述varchar
- 活动钻头
- 塔吉德整数
- 名称varchar
- 活动钻头
- TagMapId int
- TagId int(fk)
- ItemId int(fk)
- 活动钻头
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;