LINQ to Entities不识别方法NotSupportedException。

4

LINQ to EF:

 db.ReadonlyQuery<Transaction>()
     .Select(t => new ACurrentDayInfo
         {
              OrderId = t.TransactionIdentifier,
              OrderTime = t.TransactionTime,
              UserName = JsonConvert.DeserializeObject<UserInfo>(t.UserInfo).RealName ?? ""
         })
     .ToListAsync();
< p > t.UserInfo 是表字段中每条记录中的一个类似于 {"RealName ":"XY"} 的 json 字符串。如何将其转换为服务器查询?


一个解决方法是在 Select 之前调用 ToList 在客户端上执行查询。在查询中执行 JsonConvert 不是开箱即用的,详见链接的问题。 - Manfred Radlwimmer
@ManfredRadlwimmer 如果事务具有大量列或包含许多数据,则可能会影响性能,因为它将转换为select *。 - Peter Bons
@PeterBons 对,最好的解决方案是将数据存储在单独的“UserInfo”表中,并根据需要构建JSON字符串,而不是在保存信息时将其保存为JSON并在需要原始数据时进行解析。顺便说一下:就我所看到的,除了你的答案之外,所有答案都会有相同或类似的问题。 - Manfred Radlwimmer
2个回答

2

使用以下方法扩展您的ACurrentDayInfo类:

class  ACurrentDayInfo
{
    public string UserName
    {
        get
        {
            return JsonConvert.DeserializeObject<UserInfo>(UserInfo).RealName ?? "";
        }
    }
}

并将您的查询修改为:

db.ReadonlyQuery<Transaction>()
                    .Select(t => new ACurrentDayInfo
                    {
                        OrderId = t.TransactionIdentifier,
                        OrderTime = t.TransactionTime,
                        UserInfo = t.UserInfo
                    }).ToListAsync();

如果“t.UserInfo”有很多字符串,同时我想将列表存储到Redis中,这会影响性能吗? - YUu

0
在EF Dbcontext中,不支持在查询中转换json,您需要修复它:
var listData = db.ReadonlyQuery<Transaction>()
                        .Select(t => new ACurrentDayInfo
                        {
                            OrderId = t.TransactionIdentifier,
                            OrderTime = t.TransactionTime,

                            UserInfo = t.UserInfo
                        }).ToListAsync();

foreach (var item in listData)
{
    item.UserName = JsonConvert.DeserializeObject<UserInfo>(t.UserInfo).RealName ?? "" 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接