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

Lui*_*iso 10 c# linq entity-framework

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

 class Customer
 {
      public string FirstName { get; set; }
      public string LastName { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

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

db.Customers.Select(c => new { FullName = c.FirstName + " " + c.LastName })
Run Code Online (Sandbox Code Playgroud)

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

db.Customers.Select(c => new { FullName = $"{c.FirstName} {c.LastName}" })
Run Code Online (Sandbox Code Playgroud)

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

我可以使用这个现成的,做我需要做一些技巧来得到它的工作或者是确保它不会工作?

Jon*_*eet 16

我不希望如此,不.它会编译成一个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}");
Run Code Online (Sandbox Code Playgroud)


D S*_*ley 6

你可以这样做吗?

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

$"{c.FirstName} {c.LastName}" 
Run Code Online (Sandbox Code Playgroud)

string.Format("{0} {1}", c.FirstName, c.LastName);
Run Code Online (Sandbox Code Playgroud)

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

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

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