加载序列来自除外

时间:2014-02-23 17:55:36

标签: c# linq

我有这两张桌子。

var cardtagtable = (from u in db.CardTagTables
                    where u.FKCardTagID == cardtable.cardID
                    select u.CardTagName).ToList();

var tagtable = (from u in db.TagTables
                select u.TagName).ToList();

cardtagtable中选择所有名称以匹配tagtable的名称。

条件 -

我想要来自tagtable的名字,但名称来自cardtagtable列表。

所以我在这里试过 -

 var list = tagtable.Except(cardtagtable);

list是除cardtagtable以外的所有名称的序列。

到目前为止一切都还好。

现在我将使用此list并将其传递给模型。

var taglist = (from u in list
               select new TagModel {
                   tagId = u.TagID,
                   tagName = u.TagName,
                   tagCount = Convert.ToInt32(u.TagCount) == null ? 0 : Convert.ToInt32(u.TagCount),
               }).ToList();

但是这个查询说我找不到来自Model的{​​{1}}值的定义。

在这种情况下如何使用此列表?

1 个答案:

答案 0 :(得分:4)

因为u可能是string,因为您的列表是IEnumerable<string>。原因是您只选择TagNames,因此您的列表仅包含标记名称,而不是 TagTables 。而您需要选择元素而不仅仅是标记名称

var cardtagtable = (from u in db.CardTagTables
                    where u.FKCardTagID == cardtable.cardID
                    select u).ToList();

var tagtable = (from u in db.TagTables
                select u).ToList();

然后使用WhereAny代替Except,如下所示:

var list = tagtable.Where(c => !cardtagtable
                             .Any(x => x.CardTagName == c.TagName));

然后你的上一个查询应该可以正常工作。

更新:还有更优雅和优化的方法(特别是如果这是LINQ to SQL)。您只能从CardtagNames中选择cardtagtable并使用Contains方法:

var cardtagtable = (from u in db.CardTagTables
                    where u.FKCardTagID == cardtable.cardID
                    select u.CardTagName).ToList();

var tagtable = (from u in db.TagTables
                select u).ToList();

var list = tagtable.Where(c => !cardtagtable.Contains(c.TagName));