2

是否可以在 C# 中的 Linq 中将数据库中的字符串字段转换为长类型 - 并在查询中使用它?

在这里, tme 是一个 unix 时间(长) - 但数据库中的字段 targetdate - 是一个字符串。

我试过了:

var qbt = db.Calls
.Where(x => x.team == id && long.Parse(x.targetdate) <= tme);

但是我收到消息:LINQ to Entities does not recognize the method 'Int64 Parse(System.String)' method, and this method cannot be translated into a store expression.

我知道您可以在 linq 查询之前进行转换,但是有没有办法在 linq 查询中使用它?

谢谢你的帮助,

标记

4

4 回答 4

3

尝试

var qbt = db.Calls.ToList()
.Where(x => x.team == id && long.Parse(x.targetdate) <= tme);

如果您有很多记录,您可以先按团队限制它们,然后像​​下面一样调用 ToList

var qbt = db.Calls.Where(x => x.team == id).ToList()
 .Where(i=>long.Parse(i.targetdate) <= tme);

或者您可以使用AsEnumerable

var qbt = db.Calls.AsEnumerable()
.Where(x => x.team == id && long.Parse(x.targetdate) <= tme);
于 2013-05-29T10:31:24.217 回答
1

这与 Linq 被翻译成支持查询语言的方式有关,在这种情况下使用tme.ToString(). 如果您首先拉下完整的集合,您可以像这样查询,但这意味着它所说的:拉下完整的未过滤(或至少过滤较少)的集合。

于 2013-05-29T10:28:40.753 回答
1

您必须更改数据库表以不存储字符串(您可以创建一个计算列将其转换为 long 或创建一个视图,如果您无法修改现有表)或将值作为字符串进行比较。原因是实体框架 LINQ 提供者不理解long.Parse并且SqlFunctions中没有用于此目的的方法。

var stringTme = tme.ToString(CultureInfo.InvariantCulture);

var qbt = db.Calls
    .Where(x => x.team == id && ((x.targetdate.Length < stringTme.Length)
      || (x.targetdate.Length == stringTme.Length && x.targetdate <= stringTme)));
于 2013-05-29T10:37:15.407 回答
0

您必须更改数据库表以不存储字符串或将值作为字符串进行比较。原因是 Entity Framework LINQ 提供者不理解 long.Parse 并且 SqlFunctions 类中没有用于此目的的方法。请使用long.Parse()

于 2018-06-30T07:17:35.410 回答