3

我正在尝试使用 Entity Framework 将一个对象插入到我的数据库中,其中两个属性表示 SQL Server soundex 函数的结果,但我找不到任何指向正确方向的东西。

我的代码的一个大大简化的示例:

C# 对象

public class Person{
    string FirstName
    string LastName
    string FirstNameSE
    string LastNameSE
}

表结构:

FirstName   varchar(50)
LastName    varchar(50)
FirstNameSE varchar(4)
LastNameSE  varchar(4)

插入方法

public static void InsertIntoDatabase(Person vPerson){
    using (var db = new DatabaseContext()) {
        db.People.Add(vPerson);
        db.SaveChanges();
    }
}

这可行,但我需要将 FirstNameSE 和 LastNameSE 分别设置为 soundex(FirstName) 和 soundex(LastName),我无法弄清楚如何在插入时执行此操作。

我发现了如何在 LINQ to Entities 选择语句中使用 SqlFunctions 类,但是当我尝试插入数据时这对我没有帮助。

4

1 回答 1

3

我想你可能会被困在几次往返旅行中。这样的事情可能就足够了(为简洁起见,省略了错误处理):

public static void InsertIntoDatabase(Person vPerson){
    using (var db = new DatabaseContext()) {
        var soundExQuery = db.People.Select(p => 
              new { 
                      FirstNameSE = SqlFunctions.SoundCode(vPersion.FirstName), 
                      LastNameSE = SqlFunctions.SoundCode(vPersion.LastName) 
            }
        ).Take(1);

        var result = soundExQuery.ToArray();

        vPerson.FirstNameSE = result[0].FirstNameSE;
        vPersion.LastNameSE = result[0].LastNameSE;
        db.People.Add(vPerson);
        db.SaveChanges();
    }
}

进行一次往返以获取声音代码,然后插入它们。

是的,它不是很干净,但我认为您唯一的其他选择是直接使用 SQL。

db.ExecuteStoreCommand(
    @"INSERT INTO People (FirstName, LastName, FirstNameSE, LastNameSE) 
    VALUES ({0}, {1}, SOUNDEX({0}), SOUNDEX({1}))"
    , vPerson.FirstName, vPerson.LastName);

请注意,ExecuteStoreCommand会自动执行 SQL 参数化。(它不是一个string.Format)。

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.executestorecommand.aspx

于 2012-11-28T15:21:59.417 回答