我可以使用Linq to SQL进行C#字符串插值

时间:2016-02-02 16:10:31

标签: c# entity-framework linq

使用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}" })

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

我是否可以直接使用此功能,是否需要制定一些技巧才能使其正常工作,或者确定不会工作?

2 个答案:

答案 0 :(得分:14)

我不会这么想,不。它会编译为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}");

答案 1 :(得分:5)

  

你可以做这样的事吗

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

翻译过来
$"{c.FirstName} {c.LastName}" 

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

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

  

我是否需要制定一些技巧才能让它发挥作用,或者它确定它不会起作用吗?

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