【问题标题】:Entity framework - exclude list of values实体框架 - 排除值列表
【发布时间】:2009-11-16 09:15:44
【问题描述】:

通过实体框架查询数据库时,有没有办法排除对象属性的值列表?

我试图狡猾地拉这个号码:

List<String> StringList = new List<String>();
StringList.Add("ya_mama");
StringList.Add("has");
StringList.Add("fleas");

servicesEntities context = new servicesEntities();
var NoFleasQuery = (from x in context.person
                   where !StringList.Any(y => y.CompareTo(x.the_string_I_dont_want_it_to_be) == 0)  // <--- the part where I thought I was slick
                   select x);

它编译了,但是在我运行它之后,它给了我这个错误:

无法创建“闭包类型”类型的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。

'闭合类型'??我的关闭怎么样!实体框架……你伤了我的心。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    那怎么样?

        var NoFleasQuery = (from x in context.person
                            where !StringList.Any(y => x.the_string_I_dont_want_it_to_be == y)
                            select x);
    

    它对我来说很好用。但是生成的 SQL 非常糟糕:

    SELECT 
    1 AS [C1], 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Address_Id] AS [Address_Id]
    FROM [dbo].[Person] AS [Extent1]
    WHERE  NOT EXISTS (SELECT 
        1 AS [C1]
        FROM  (SELECT 
            N'John Doe' AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]
        UNION ALL
            SELECT 
            N'Jack Black' AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable2]) AS [UnionAll1]
        WHERE [Extent1].[Name] = [UnionAll1].[C1]
    )
    

    它构建一个子查询,它是其他子查询的联合,而不是使用“NOT IN”......可能不是很有效!

    【讨论】:

      【解决方案2】:

      试试这个:

      where !StringList.Contains(x.the_string_I_dont_want_it_to_be)
      

      【讨论】:

      • 它给了我这个数字:LINQ to Entities 无法识别方法 'Boolean Contains(System.String)' 方法,并且此方法无法转换为存储表达式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多