如何在实体框架插入上使用SqlFunctions.SoundCode?

时间:2012-11-28 15:04:23

标签: c# entity-framework

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

我的代码的简化示例:

C#Object

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类,但是当我尝试插入数据时,这对我没有帮助。

1 个答案:

答案 0 :(得分: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