实体框架。嵌套集合查询在setter方法上传递Empty“value”

时间:2015-06-30 15:48:30

标签: c# .net linq entity-framework linq-to-entities

我有一个“驱动程序”模型,其中包含一对多“卡车”导航属性。 我想用逗号分隔的字符串属性填充示例“TruckDriver”模型,该属性包含所有相关的Truck ID。

为了无缝地填充这个模型,我实现了一个setter函数,它接收一个Int32 []数组并将其序列化为一个String。

我面临的问题是,当尝试使用投影使用单个查询填充此模型时,linq to entities将空集合传递给setter“value”属性。

奇怪的是,如果不尝试处理数据,但只将其指定为IEnumerable,它可以正常工作。如果我首先实例化我的数据然后执行查询,它也能正常工作。

示例代码:

模特试图填充。

public class TruckDriver
{
    public String Name { get; set; }
    public String Serialized { get { return this._serialized; } }
    public IEnumerable<Int32> OriginalArray { get; set; }  <--Debug Property to test actual data returned by the query.
    private String _serialized;
    public IEnumerable<Int32> setSerialized {
        set { 
            this._serialized = String.Join(",", value); <---- value is always an empty collection on the debugger
        } 
    }
}

查询执行

        var temp = db.Drivers.Include(d=>d.Trucks);
         TruckDriver[] drivers=   temp.Select(d => new TruckDriver
            {
                Name= d.FirstName+" "+d.LastName,
                OriginalArray = d.Trucks.Select(r=>r.Id),
                setSerialized = d.Trucks.Select(r => r.Id),
            }).ToArray();
        return drivers;

返回数据。

[{"Name":"Mark Miller","Serialized":"","OriginalArray":[1,4]},{"Name":"John Smith","Serialized":"","OriginalArray":[2,3]}]

如你所见。 “OriginalArray”和“setSerialized”获得完全相同的数据。虽然“OriginalArray”正确包含多个整数,但“Serialized”是一个空字符串。

如果我在执行查询之前实例化所有数据,则会正确填充模型。

查询前的实例化。

        var temp = db.Drivers.Include(d=>d.Trucks).ToArray();
         TruckDriver[] drivers=   temp.Select(d => new TruckDriver
            {
                Name= d.FirstName+" "+d.LastName,
                OriginalArray = d.Trucks.Select(r=>r.Id),
                setSerialized = d.Trucks.Select(r => r.Id),
            }).ToArray();

结果

[{"Name":"Mark Miller","Serialized":"1,4","OriginalArray":[1,4]},{"Name":"John Smith","Serialized":"2,3","OriginalArray":[2,3]}]

有趣的是,如果我为“OriginalArray”属性编写自己的setter,“value”在“set”执行期间仍然是调试器中的空集合,尽管之后数据填充正确。

public class TruckDriver
{
    public String Name { get; set; }
    public IEnumerable<Int32> OriginalArray 
    { 
        get{
            return this._originalArray;
        }
        set {
            this._originalArray = value; //<-- value is still an empty collection
        }
    }
    private IEnumerable<Int32> _originalArray;

}

结果。

[{"Name":"Mark Miller","OriginalArray":[1,4]},{"Name":"John Smith","OriginalArray":[2,3]}]

任何帮助非常感谢。

1 个答案:

答案 0 :(得分:0)

试图让<em class="tag" ng-repeat="tag in post.tags">{{tag.tag_name}}</em> 在数据库中发生是行不通的,因为Linq不知道如何将它翻译成SQL。您可能可以为它编写原始SQL查询或存储过程,但我不认为您获得了很多。您基本上必须先将其拉入内存然后创建序列化字符串。您可以使用投影到匿名对象来限制您提取的数据。

string.Join()