我可以在Linq to SQL中使用C#字符串插值

在使用EF(至少达到6.1.3版本)时,假设您有这样的类:

class Customer { public string FirstName { get; set; } public string LastName { get; set; } } 

如果要获取一个字段FullName ,它是两个( FirstNameLastName )的串联作为查询结果中的字段,您必须执行以下操作:

 db.Customers.Select(c => new { FullName = c.FirstName + " " + c.LastName }) 

既然在C#中有字符串插值 ,你可以做这样的事情

 db.Customers.Select(c => new { FullName = $"{c.FirstName} {c.LastName}" }) 

这似乎是一个微不足道的例子(它是),但问题仍然存在。

我是否可以开箱即用,我是否需要制定一些技巧才能使其正常工作或确定它不起作用?

我不希望如此,不。 它将编译成string.Format调用,我不希望它被支持。 如果你真的需要在SQL部分完成投影,你可以测试它……但是,正常情况下,当你完成了需要在数据库中执行的部分查询时,使用AsEnumerable() ,然后在之后使用Select

 var query = db.Customers // Project to just the properties we need .Select(c => new { c.FirstName, c.LastName }) // Perform the rest of the query in-process .AsEnumerable() .Select(c => $"{c.FirstName} {c.LastName}"); 

你可以这样做吗?

不是一般意义上的,因为字符串插值只是转换为string.Format调用,用数字替换占位符并将值作为参数传递。 所以你的格式会被翻译出来

 $"{c.FirstName} {c.LastName}" 

 string.Format("{0} {1}", c.FirstName, c.LastName); 

由于并非string.Format() (自定义格式字符串,填充,对齐等)的所有function都可以直接转换为SQL,因此不受支持。

我是否需要制定一些技巧才能使其正常工作或确定它不起作用?

我怀疑你有什么技巧可以让它在Ling-to-SQL中工作,因为你在内部处理string.Format 。 您可以检索所需的所有部分,调用AsEnumerable以将上下文从Linq-to更改为Linq-to-Objects,然后在后续投影中使用插值,但在这个简单的情况下,使用字符串连接更清晰。