有没有一种方法可以使用LINQ在join子句中执行字符串插值?

ccrfmcuu  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(135)

我必须将查询从遗留数据库转换为LINQ,但我遇到了一些问题。基本上我需要做一个左连接,我想比较的属性是第二个表中属性的组合。

SELECT A.DATE, B.UNIT, B.PERSON
FROM TABLE1 A 
LEFT JOIN TABLE2 B ON A.KEY = CONCAT(B.UNIT, B.CONTRACT, B.VARIABLE)
WHERE B.DATE = someDate

字符串
到目前为止,我已经尝试过这种方式,但没有成功:

var date = someDate;

from a in _context.Table1

join b0 in _context.Table2 on a.Key equals $"{b0.Unit}{b0.Contract}{b0.Variable}" into bGroup
from b in bGroup.DefaultIfEmpty()
where b.Date == date
                    
select new ResponseDto
{
    Date = a.Date,
    Unit = b.Unit,
    Person = b.Person
})
{
  "Message": "The LINQ expression '...' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.",
  "ErrorName": "InvalidOperationException"
}

当删除字符串插值时,查询运行没有任何问题,所以我认为问题在于我处理这个问题的方式。有办法做到这一点吗?

disbfnqx

disbfnqx1#

EF无法将string.Format调用(插入的字符串将转换为)转换为SQL,因为Format可以做的不仅仅是连接字符串。它是does support string.Concat,但只有带2个参数的重载。我会尝试用老式的方式连接字符串:

join b0 in _context.Table2 on a.Key equals (b0.Unit + b0.Contract + b0.Variable)

字符串

kknvjkwl

kknvjkwl2#

根据您的数据尝试的方法:

  • 连接C#查询中的字段,如D。Stanly建议
  • 假设连接的字段是固定宽度的,则基于固定宽度的子字符串拆分C#查询中的字段
  • 如果表中没有太多数据,并且您不经常运行此查询,则引入原始数据并对数据执行内存中C#查询。除非您知道搜索的数据非常小,并且每天完成的查询数量很少,否则不建议这样做
  • 为查询创建一个SQL视图,并将字段连接起来,然后查询该视图。如果您需要进行更新,则不建议使用
  • 如果数据以只读方式使用,请向查询添加EntityFrameworkAsNoTracking()
  • 如果其中一个数据字段,单位,合同或变量,是非常有选择性或唯一的,然后选择该字段只在实体框架C#查询,然后过滤结果在您的C#代码。
  • 实体框架传递SQL

一般的想法是将带回C#内存的数据子集减少到尽可能小,然后在C#中进行过滤。
注意:如果表中有数百万行,则需要使用不同的方法。很可能是SQL方法。

相关问题