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

时间:2013-08-17 13:17:38

标签: string entity-framework formatting

以下查询完全正常,并填充其下拉列表。数据库中的数据全部以大写形式存储,即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),除了原始查询之外没有其他工作。任何帮助表示赞赏。

附录: 还有一些进一步的研究告诉我,在运行查询之前,不能使用字符串转换和cultureinfo等.Net对象。如果是这样,它就解释了为什么它不起作用。以下解决了我的问题,但我仍然想知道是否有办法在LINQ to 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

1 个答案:

答案 0 :(得分:0)

您可以在SELECT中进行转换。这是一个例子(使用过度简化的城市名称转换器):

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; }
    }
}