【问题标题】:Linq Contains and DistinctLinq 包含和区分
【发布时间】:2011-10-22 21:15:05
【问题描述】:

我有以下 3 个表格及其字段

书籍(Id_Book | Title | Year)
Book_Themes (Id | Id_Book| Id_Theme)
主题(Id_Theme|标题)

我还有一个带有 Id_Themes 的 Giud 数组

Guid [] themesArray = new Guid []{new Guid("6236c491-b4ae-4a2f-819e-06a38bf2cf41"), new Guid("06586887-7e3f-4f0a-bb17-40c86bfa76ce")};

我正在尝试从 themesArray

中获取所有包含任何 Theme_IdsBooks

这是我目前所拥有的,但它不起作用。不确定如何在此场景中使用 Contains。

int index = 1; int size= 10;
var books = (from book in DB.Books
               join bookWThemes in DB.Book_Themes
               on book.Id_Book equals bookWThemes.Id_Book

               where themesArray.Contains(bookWThemes.Id_Theme)                           
               orderby book.Year
               select book)
               .Skip((index - 1) * page)
               .Take(size);

我在 ThemesArray.Contains(bookWThemes.Id_Theme) 上遇到错误:System.Guid[] 不包含 Contains 的定义。另外我不确定在哪里放置 Distinct

****更新****

注意到我的模型的 Id_Theme 可以为空...我更改了数据库并且没有反映我的模型上的更改。因此,要回答是否可以为空的问题,只需将 Contains 行更改为 ThemesArray.Contains(bookWThemes.Id_Theme.Value)... 并通过此更改起作用。

感谢大家的帮助!

【问题讨论】:

  • 这是编译时错误吗?
  • Linq to Entities 还是 Linq to SQL?
  • 是的,这是编译时错误
  • 这是 Linq to Entities

标签: linq join contains


【解决方案1】:

奇怪的是,您的 LINQ 查询在 .Contains 上出现故障。 IEnumerable 和 List 三种形式都适用于我。

    [Test]
    public void Test43()
    {
        var a = new List<Guid>(){new Guid(),new Guid(),new Guid()};
        a.Contains(new Guid());  // works okay
        var b = (IEnumerable<Guid>)a;
        b.Contains<Guid>(new Guid()); // works okay
        b.Contains(new Guid()); // works okay 
    }

【讨论】:

  • 谢谢伙计……它现在可以工作了。实际上我注意到了这一点并更新了我的数据库和模型......但似乎这种变化并没有反映在我的模型上。因此,如果它可以为空,只需在 ThemesArray.Contains(bookWThemes.Id_Theme.Value)... 处使用它...我只是在修复我的模型
【解决方案2】:

尝试将Guid[] 转换为List&lt;Guid&gt;,然后您可以在其上使用 Contains。

where themesArray.ToList().Contains(bookWThemes.Id_Theme)

【讨论】:

  • 有几个编译错误。 1. 'System.Collections.Generic.List.Contains(System.Guid)' 的最佳重载方法匹配有一些无效参数。 2.无法从“System.Guid”转换?到'System.Guid'
  • 好的,这就是我为解决它所做的 - 其中主题Array.Contains(bookWThemes.Id_Theme.Value)
  • @Rodrigo:这意味着您的 Id_Theme 属性在您的数据模型中可以为空。如果没有您发布您的实体的样子,没人会知道
  • 实际上我注意到了这一点并更新了我的数据库和模型......但似乎这个变化并没有反映在我的模型上
【解决方案3】:

对于“不同”的问题,请在此处拨打电话:

           select book)
           .Distinct()  // <--
           .Skip((index - 1) * page)

【讨论】:

  • 感谢 cdhowie,问题更多是关于如何使用 Contains... 刚刚编辑了问题以反映这一点
  • 我刚刚弄清楚包含部分......现在是不同的。我按照您的建议放置了 Distinct,并收到了此消息 - 仅 LINQ to Entities 中的排序输入支持“跳过”方法。方法“OrderBy”必须在方法“Skip”之前调用。
  • 哎呀,我猜你不能把Distinct() 调用放在那里——你需要在orderby 之前插入它。见this article
  • 只是在处理这个问题,但得到了同样的错误。我想我会为 Distinct 文章发布另一个问题,因为这篇文章更多地是关于 Contains 子句...谢谢您的帮助!
猜你喜欢
  • 2023-04-02
  • 2015-01-22
  • 2011-11-04
  • 2011-02-21
  • 1970-01-01
  • 2014-10-08
  • 2012-01-03
  • 2023-04-01
  • 2015-10-15
相关资源
最近更新 更多