C# 替换往返序列化反序列化

C# 替换往返序列化反序列化,c#,json,serialization,constructor,C#,Json,Serialization,Constructor,我有一个超过100列(包括blob)的表,我只想用几个填充列来复制object。 现在,我通过选择所需的列并使用Json.NET进行往返序列化和反序列化来实现这一点,这是不高效的。处理这种情况的最佳方法是什么 BL.Case mCase; BL.Case temp = db.Cases.Select( xx => new { CaseID = xx.CaseID,

我有一个超过100列(包括blob)的表,我只想用几个填充列来复制object。 现在,我通过选择所需的列并使用Json.NET进行往返序列化和反序列化来实现这一点,这是不高效的。处理这种情况的最佳方法是什么

BL.Case mCase;
BL.Case temp = db.Cases.Select(
               xx => new
               {
                   CaseID = xx.CaseID,
                   FirstName = xx.FirstName,
                   LastName = xx.LastName
              }).FirstOrDefault(u => u.CaseID == CaseID);

mCase = Newtonsoft.Json.JsonConvert.DeserializeObject<BL.Case>(Newtonsoft.Json.JsonConvert.SerializeObject(temp));
BL.Case-mCase;
BL.案例温度=db.Cases.Select(
xx=>新
{
CaseID=xx.CaseID,
FirstName=xx.FirstName,
LastName=xx.LastName
}).FirstOrDefault(u=>u.CaseID==CaseID);
mCase=Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(temp));
使用

这样做:

BL.Case mCase = null;
var temp = db.Cases.Select(
                xx => new
                {
                    CaseID = xx.CaseID,
                    FirstName = xx.FirstName,
                    LastName = xx.LastName
                }).FirstOrDefault(u => u.CaseID == CaseID);



if (temp != null)
{
    mCase = Mapper.DynamicMap<BL.Case>(temp);
}
BL.Case mCase=null;
var temp=db.Cases.Select(
xx=>新
{
CaseID=xx.CaseID,
FirstName=xx.FirstName,
LastName=xx.LastName
}).FirstOrDefault(u=>u.CaseID==CaseID);
如果(温度!=null)
{
mCase=Mapper.DynamicMap(temp);
}

另一个需要更多代码(但性能可能更好)的解决方案是执行以下操作:

如果您需要单个项目:

BL.Case mCase = null;
var temp = db.Cases.Select(
            xx => new
            {
                CaseID = xx.CaseID,
                FirstName = xx.FirstName,
                LastName = xx.LastName
            }).FirstOrDefault(u => u.CaseID == CaseID);



if (temp != null)
{
    mCase = new Case()
    {
        CaseID = temp.CaseID,
        FirstName = temp.FirstName,
        LastName = temp.LastName,
    };
}
如果您需要多个项目:

var temp = db.Cases.Select(
            xx => new
            {
                CaseID = xx.CaseID,
                FirstName = xx.FirstName,
                LastName = xx.LastName
            }); //Here you can filter your query if you want using Where

var result = temp
.ToList() //This will actually execute the query on the database
.Select(x => new Case() //Now you can do this since now we are working on in-memory data
{
    CaseID = x.CaseID,
    FirstName = x.FirstName,
    LastName = x.LastName
});

序列化是深度克隆的常见方式。。。当您出于任何原因不能直接创建对象时,这是一种非常合理的方法。是否有您不能执行的原因
db.Cases.FirstOrDefault(u=>u.CaseID==CaseID)。选择(xx=>new BL.Case{CaseID=xx.CaseID…})?您是否尝试确定您的实际性能瓶颈?例如,如果字符串格式化占用的时间太多,可以考虑跳转到基本上是二进制JSON。@ MEATAXE,这是不允许的设计,它将抛出异常显式构造XXXX在查询中是不允许的。谢谢,AutoPAPER在小循环中提高了100%的性能(大约100次)。在更大的循环(100000次运行)中,它将性能提高25%左右。您是说25%还是2500%?25%表示只快1/4。25%表示快1/4 100000个对象大约需要5500毫秒