String 在实体框架查询中转换字符串

String 在实体框架查询中转换字符串,string,entity-framework,formatting,String,Entity Framework,Formatting,下面的查询工作得非常好,并填充其下拉列表。数据库中的数据以全大写形式存储,即PALM BEACH。我想将其转换为适当的大小写,这显然可以在事后通过迭代返回的列表并重新格式化来完成,但我应该能够在查询本身中完成。以下查询工作正常 Dim citylist As List(Of String) = (From c In ctx.ziptaxes Where c.StateID = ddlState

下面的查询工作得非常好,并填充其下拉列表。数据库中的数据以全大写形式存储,即PALM BEACH。我想将其转换为适当的大小写,这显然可以在事后通过迭代返回的列表并重新格式化来完成,但我应该能够在查询本身中完成。以下查询工作正常

 Dim citylist As List(Of String) = (From c In ctx.ziptaxes
                                                   Where c.StateID = ddlStates.SelectedIndex                                                      
                                                   Order By c.City Ascending
                                                   Select c.City).ToList()
但是如果我试着把它转换成这样的东西,它就失败了

 Dim citylist As List(Of String) = (From c In ctx.ziptaxes
                                                   Where c.StateID = ddlStates.SelectedIndex
                                                   Let cityname = StrConv(c.City, VbStrConv.ProperCase)
                                                   Order By cityname Ascending
                                                   Select cityname).ToList()
我也尝试过使用区域性信息和String.Format(c.City,vbProperCase),除了原始的查询之外,没有别的方法。谢谢你的帮助

附录: 一些进一步的研究告诉我,在运行查询之前不能使用.Net对象,如字符串转换和cultureinfo。如果是这样的话,它解释了为什么它不起作用。下面解决了我的问题,但我仍然想知道是否有办法在LINQ到EF中实现这一点

 Dim citylist As List(Of String) = (From c In ctx.ziptaxes
                                                   Where c.StateID = ddlStates.SelectedIndex
                                                   Order By c.City Ascending
                                                   Select c.City).ToList()
                If citylist.Count > 0 Then
                    For i As Integer = 0 To citylist.Count - 1
                        citylist(i) = StrConv(citylist(i).ToLower(), vbProperCase)
                    Next
                    With ddlCity
                        .Items.Clear()
                        .DataSource = citylist.Distinct()
                        .DataBind()
                        .Items.Insert(0, "Select a city")
                        .SelectedIndex = 0
                    End With
                End If

您可以在选择中进行转换。下面是一个示例(使用过度简化的城市名称转换器):

使用System.Collections.Generic;
使用System.Linq;
使用NUnit.Framework;
名称空间关键问题
{
[测试夹具]
公共类StackOverflowTests
{
私人城市;
[TestFixtureSetUp]
公众假期安排
{
_城市=新列表
{
新城{Id=1,Name=“FLINT”,StateId=1},
新城{Id=2,Name=“SAGINAW”,StateId=1},
新城{Id=3,Name=“底特律”,StateId=1},
新城{Id=4,Name=“FLint”,StateId=1}
};
}
[测试]
公共void TestCountryQuery()
{
var数据=\u城市
.其中(c=>c.StateId==1)
.OrderBy(c=>c.Name)
.选择(c=>StrConv(c.Name))
.Distinct().ToList();
断言(data.Count==3);
}
私有静态字符串StrConv(原始字符串)
{
var firstLetter=original.Substring(0,1.ToUpper();
var theRest=original.Substring(1,original.Length-1.ToLower();
返回第一个字母+剩余字母;
}
}
公营城市
{
公共int Id{get;set;}
public int StateId{get;set;}
公共字符串名称{get;set;}
}
}
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;

namespace LinqQuestion
{
    [TestFixture]
    public class StackOverflowTests
    {
        private IEnumerable<City> _cities;

        [TestFixtureSetUp]
        public void Arrange()
        {
            _cities = new List<City>
            {
                new City { Id = 1, Name = "FLINT", StateId = 1 },
                new City { Id = 2, Name = "SAGINAW", StateId = 1 },
                new City { Id = 3, Name = "DETROIT", StateId = 1 },
                new City { Id = 4, Name = "FLint", StateId = 1 }
            };
        }

        [Test]
        public void TestCountryQuery()
        {
            var data = _cities
                .Where(c => c.StateId == 1)
                .OrderBy(c => c.Name)
                .Select(c => StrConv(c.Name))
                .Distinct().ToList();

            Assert.That(data.Count == 3);
        }

        private static string StrConv(string original)
        {
            var firstLetter = original.Substring(0, 1).ToUpper();
            var theRest = original.Substring(1, original.Length - 1).ToLower();
            return firstLetter + theRest;
        }
    }

    public class City
    {
        public int Id { get; set; }
        public int StateId { get; set; }
        public string Name { get; set; }
    }
}