我有一个“驱动程序”模型,其中包含一对多“卡车”导航属性。 我想用逗号分隔的字符串属性填充示例“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]}]
任何帮助非常感谢。
答案 0 :(得分:0)
试图让<em class="tag" ng-repeat="tag in post.tags">{{tag.tag_name}}</em>
在数据库中发生是行不通的,因为Linq不知道如何将它翻译成SQL。您可能可以为它编写原始SQL查询或存储过程,但我不认为您获得了很多。您基本上必须先将其拉入内存然后创建序列化字符串。您可以使用投影到匿名对象来限制您提取的数据。
string.Join()