【问题标题】:Entity framework exists clause with lambda带有 lambda 的实体框架存在子句
【发布时间】:2013-10-28 17:03:40
【问题描述】:

我看到了类似问题的答案 (Entity framework and Exists clause),但没有使用 lambda,我想了解问题所在, 无论是我的映射还是使用方式。我正在使用实体框架 5。

这是我的映射:

public class Attribute : EntityWithGuid
{
    ... Other mappings ....

    [InverseProperty("Attribute")]
    public virtual ICollection<CategoryAttribute> CategoryAttributes { get; set; }
}

public class Category : EntityWithGuid
{
    ... Other mappings ....

    [InverseProperty("Category")]
    public virtual ICollection<CategoryAttribute> CategoryAttributes { get; set; }
}

public class CategoryAttribute : EntityWithGuid
{
    ... Other mappings ....

    [ForeignKey("Category_Id")]
    public virtual Category Category { get; set; }
    public string Category_Id { get; set; }

    [ForeignKey("Attribute_Id")]
    public virtual Attribute Attribute { get; set; }
    public string Attribute_Id { get; set; }
}

如果我运行下面的命令,它工作正常,结果 SQL 是

var query = Attribute.Where(x => !x.CategoryAttributes.Any());

SELECT 
    Extent1.Id,
    Extent1.Name,
    Extent1.Type,
    Extent1.Active
FROM
    Attribute AS Extent1
WHERE
    NOT EXISTS( SELECT 
            1 AS C1
        FROM
            CategoryAttribute AS Extent2
        WHERE
            Extent1.Id = Extent2.Attribute_Id)

但是,如果我再添加一个子句,则会出现一个 Project2 别名的 Attribute 而不是 Extent1 并给出错误,因为在剩余 Extent1.Id 内的存在子句中

var query = Attribute.Where(x => !x.CategoryAttributes.Any(y=>y.Category_Id == idcategory));

SELECT 
    Project2.Id,
    Project2.Name,
    Project2.Type,
    Project2.Active
FROM
    Attribute AS Project2
WHERE
    NOT EXISTS( SELECT 
            1 AS C1
        FROM
            CategoryAttribute AS Extent2
        WHERE
            (Extent1.Id = Extent2.Attribute_Id)
                AND (Extent2.Category_Id = @p__linq__0))

例外是

“where 子句”中的未知列“Extent1.Id”

【问题讨论】:

  • 你能发布异常吗?
  • 期望是 {"'where 子句'中的未知列 'Extent1.Id'"}

标签: entity-framework lambda


【解决方案1】:

找到问题了。

在执行一个简单的查询并收到一个类似的错误后,认为有问题。在查询下方,SQL 和不受欢迎的别名 Project

User.Where(x => x.Name.Contains(partialName))

SELECT 
    Project1.Id,
    Project1.Name
FROM
    User AS Project1
WHERE
    (LOCATE('Marcelo', Extent1.Name)) > 0
ORDER BY Project1.Name ASC

最近我升级了 MySql 并附带了新的 Net 连接器,版本 6.7.4。我回到以前的网络连接器版本(6.5.6),一切都恢复正常了。

【讨论】:

    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 2011-01-23
    • 2022-01-13
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多