我必须将查询从遗留数据库转换为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"
}
当删除字符串插值时,查询运行没有任何问题,所以我认为问题在于我处理这个问题的方式。有办法做到这一点吗?
2条答案
按热度按时间disbfnqx1#
EF无法将
string.Format
调用(插入的字符串将转换为)转换为SQL,因为Format
可以做的不仅仅是连接字符串。它是does supportstring.Concat
,但只有带2个参数的重载。我会尝试用老式的方式连接字符串:字符串
kknvjkwl2#
根据您的数据尝试的方法:
一般的想法是将带回C#内存的数据子集减少到尽可能小,然后在C#中进行过滤。
注意:如果表中有数百万行,则需要使用不同的方法。很可能是SQL方法。