代码之家  ›  专栏  ›  技术社区  ›  AJ.

已编译查询列表。包含(列表中的…位置)功能?

  •  2
  • AJ.  · 技术社区  · 14 年前

    我正在尝试使用Linq to Entities编写一个CompiledQuery,该实体将替换采用两个数组(在本例中为逗号分隔的文本)参数的存储过程。基本上,SQL是这样的:

    *Stored Proc definition*
    @ArrayParm1    TEXT,
    @ArrayParm2    TEXT
    -- etc. 
    SELECT [fieldList] 
    FROM someTable
    WHERE someTable.Field1 IN (SELECT * FROM dbo.fncCSVToTable(@ArrayParm1))
    AND someTable.Field2 IN (SELECT * FROM dbo.fncCSVToTable(@ArrayParm2))
    

    dbo.fncCSVToTable 使用数组值创建单列临时表。

    public static Func<EntityContext, List<int>, List<string> IQueryable<EntityType>>
        SomeQuery = 
            CompiledQuery.Compile((EntityContext context, List<int> arrayParm1, 
                                   List<string> arrayParm2) =>
                from c in context.SomeTableEntities
                where arrayParm1.Contains(c.Field1)
                    && arrayParm2.Contains(c.Field2)
                select new EntityType
                { 
                    //projection
                });
    

    但是,我得到一个运行时错误,指出 Func<> 不能是列表,并且只支持标量参数。这对我来说是有意义的,但我仍然觉得必须有一种方法在编译的查询中实现这一点。有人知道怎么做吗 List.Contains WHERE ... IN L2E编译查询中的类型功能?

    1 回复  |  直到 14 年前
        1
  •  6
  •   Jon Skeet    14 年前

    我怀疑在为非编译查询生成的SQL中,它使用了

    WHERE someTable.Field1 In (?, ?, ?)
    

    例如,对于三个值。。。而不是 fncCSVToTable 功能。