首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >许多到许多-从表- EF LINQ获得适当的记录。

许多到许多-从表- EF LINQ获得适当的记录。
EN

Stack Overflow用户
提问于 2014-09-23 08:31:20
回答 2查看 106关注 0票数 0

我有两张有关系的桌子-多对多。比方说A和B桌。

我还有带有B表元素I的List<List<int>> TagIdList

我如何从表A中找到所有TagIdList[i]元素的所有元素?我只需要表A中的I,所以它不必是表中的所有任务行。

示例:

A:任务:

id: 1,2,3,4,5,6

B:标签:

id: 1,2,3,4

A链接:

1-2;1-3;2-1;2-2;5-3;5-4;6-1;6-6;

代码语言:javascript
运行
复制
List<List<int>> TagIdList  //(ids from TAGS)   
TagIdList[0]= {2,3}   
TagIdList[1]= {1}   
TagIdList[2]= {2,6}

结果:(任务ids)

代码语言:javascript
运行
复制
i=0; -> 1  
i=1; -> 2,6  
i=2; -> null

我试过:

代码语言:javascript
运行
复制
List<int> tags = model.TagIdList[i].IdList; //I've got it from my View
List<TASKS> tasks = myEntity.TASKS.Where(t => t.TAGS == tags).ToList();

我无法获得任务,因为有一个错误:无法创建类型的常量值。在此上下文中只支持基本类型。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-29 14:26:30

我找到了解决办法。也许不太理想,但很管用。

代码语言:javascript
运行
复制
List<int> tags = model.TagIdList[i].IdList;

List<List<int>> whole_list = new List<List<int>>();

foreach (var t in tags) //I'm looking for every tasks' ids in every given tag
{   
    var temp = myEntity.TAGS.Find(t).TASKS.Select(task => task.Id).ToList();
    whole_list.Add(temp);
}

//now I want first list from whole_list to compare with the other lists
List<int> collection = whole_list[0]; //collection it's tasks
whole_list.Remove(collection);

//I'm taking a part which is common to all lists from whole_list
foreach (List<int> k in whole_list)
{   
    var temp = collection.Intersect(k);
    collection = temp.ToList();
}

//the collection is now what I wanted for TagIdList[i] - every task which has every tags from TagIdList[i].IdList
票数 0
EN

Stack Overflow用户

发布于 2014-09-23 09:04:50

你的问题在这里:myEntity.TASKS.Where(t => t.TAGS == tags)

如果我明白这个问题正确的话,你需要这样的东西:

两个int列表的比较方法(取自here)

代码语言:javascript
运行
复制
public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2) {
  var cnt = new Dictionary<T, int>();
  foreach (T s in list1) {
    if (cnt.ContainsKey(s)) {
      cnt[s]++;
    } else {
      cnt.Add(s, 1);
    }
  }
  foreach (T s in list2) {
    if (cnt.ContainsKey(s)) {
      cnt[s]--;
    } else {
      return false;
    }
  }
  return cnt.Values.All(c => c == 0);
}

而不是在linq表达式中使用此方法:

代码语言:javascript
运行
复制
myEntity.TASKS.AsEnumerable().Where(t => ScrambledEquals<int>(t.TAGS.Select(tag=>tag.id).ToList(),tags))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25990429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档