0

假设我们有一个具有 int 数组作为其属性之一的类。

public MyClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int[] Values { get; set; }
}

我们使用实体框架将其存储在数据库中。我注意到的是 EF 将 Values 属性转换为 varchar(max)。

现在,我们想要做的是查询数据库并返回“Values”包含给定 int 参数的记录。

public List<MyClass> Search(int valueToSearch)
{
    return context.MyClasses.Where(x => x.Values.Contains(valueToSearch)).ToList();
}

但是,这会引发 linq-to-sql 不支持 contains 命令的异常。

我也尝试过Where(x => x.Values.Any(y => y == valueToSearch)),但这引发了同样的异常。

我想这与 EF 将数组转换为 varchar 的事实有关,因此它将无法使用 contains 语句或其他内容。也许单独的值表可以解决问题,但是创建一个只有一个整数属性的类看起来有点愚蠢?

有没有更好的方法来解决这个问题?

我发现很多相反的例子(SQL IN 语句),但这不是我们要找的。我们只有一个整数作为参数,但我们的实体中有几个整数。

我们将 EF5 与 .NET 4.0 一起使用。

谢谢!

编辑

看起来 varchar 是我们自己创建的字符串。因为它是我自己没有编写的代码,所以我没有意识到这一点。该字符串当然会被翻译成varchar。

所以现在问题变成了“存储原始类型数组的最佳方法是什么?” 并且这个问题已经在 SO 上被多次回答(其中一个在评论中提供)。

4

1 回答 1

1

在 linq 之外对实体进行查询:(您必须提取所有行)

public List<MyClass> Search(int valueToSearch)
{
    var c = context.MyClasses.ToList(); // cache
    return c.Where(x => x.Values.Contains(valueToSearch));
}

编辑:如果您当前手动将整数数组转换为字符串,则将您的类属性从整数数组更改为字符串。

虽然,我推荐一张新桌子。在 db 字段中作为字符串的整数数组有点味道。

于 2013-09-25T13:52:41.517 回答