首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Linq-to-entities设置扩展属性

通过Linq-to-entities设置扩展属性
EN

Stack Overflow用户
提问于 2011-01-25 03:21:54
回答 4查看 2.3K关注 0票数 3

我想要检索数据,并设置动态添加到entityobject(通过分部类)的属性。

我该怎么做呢?

这是我的问题:

代码语言:javascript
复制
var ret = (from item in contex.Items
               select new Itemm
               {   
                  Title = item.Title,
                  Count = 1 // more complex: Count =item.refToAnotherEntity.Count()                                          
               });

public partial class Itemm 
{
     public int Count { get; set; }
}

我收到以下错误:无法在LINQ to Entities查询中构造实体或复杂类型

EN

回答 4

Stack Overflow用户

发布于 2011-01-25 03:29:23

问题是Linq to Entities试图将整个表达式转换为SQL。这在你的“新”语句中是不可能实现的。

尝试以下操作:

代码语言:javascript
复制
var ret = (from item in contex.Items
           select new Itemm
           ).ToList();
ret = (from item in ret
       select new Itemm
           {   
              Title = item.Title,
              Count = 1                                           
           }).ToList();

基本上,在尝试重新构造结果之前,您要确保从SQL server返回结果( ToList()可以做到这一点)。它并不美观,您可能可以将其清理一下,但上面的代码应该可以工作。

票数 0
EN

Stack Overflow用户

发布于 2011-01-25 03:38:53

您的查询将不会转换为正确的SQL,因为linq将不知道如何处理您的额外属性。

有一些方法可以初始化您的自定义属性。

您可以创建

部分无效的OnCreated() {}

并在此处编写您的自定义初始化,如果您希望在从数据库加载之后加载,则可以重写

protected override void OnLoaded(bool OnLoaded){ base.OnLoaded( initial);}

票数 0
EN

Stack Overflow用户

发布于 2012-09-25 01:34:18

我正在努力实现和你一样的结果。到目前为止,我最好的解决方案是为我的实体创建一个包装器,该包装器具有Count属性,以便在分部类上设置额外属性。以您的案例为例,这将是这样的:

代码语言:javascript
复制
public class ItemWithCount
{
   public Item Item { get; set; }
   public int Count
   {
        get { return Item.Count; }
        set { Item.Count = value; }
   }
}

然后,您可以像这样进行查询:

代码语言:javascript
复制
var ret = (from item in contex.Items
           select new ItemWithCount
           {   
              Item = item,
              Count = item.refToAnotherEntity.Count()                                          
           }).AsEnumerable().Select(x => x.Item);

您可以选择具有相同2个属性的匿名类型,而不是创建包装器,但这意味着在查询之后,您必须遍历结果并设置每个实体的属性Count的值。如下所示:

代码语言:javascript
复制
var ret = (from item in contex.Items
           select new
           {   
              Item = item,
              Count = item.refToAnotherEntity.Count()                                          
           });
Parallel.ForEach(ret, x => x.Item.Count = x.Count);
var results = ret.Select(x => x.Item);

我更喜欢第一个选项,尽管我希望有一个不需要创建新类的解决方案……有什么想法吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4786142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档