【问题标题】:LINQ to Entity - using anonymous object in a queryLINQ to Entity - 在查询中使用匿名对象
【发布时间】:2013-03-22 09:06:18
【问题描述】:

我正在尝试编写 LINQ2Entity 查询,它将仅从表中返回 3 列,然后将结果设置为 DataSourceComboBox

我的问题是这样的。首先 - 从表中选择所有我使用这样的服务:

IList<SoleColor> soles = SoleColorService.All().ToList();

准备好设置为等待此类型数据的 ComboBox 的 DataSource。但是,因为我想选择匿名对象来仅存储查询结果中的 3 列,所以我修改了我的查询,如下所示:

IList<SoleColor> soles = SoleColorService.All()
                    .GroupBy(t => t.Sole.Code)
                    .Select(g => new
                    {
                        SoleCode = g.Key,
                        SoleName = g.Select(t => t.Sole.Name),
                        SoleId   = g.Select(t => t.SoleID)
                    }); 

这会导致将 .Selectas 错误标记为以下文本“无法将 System.Linq.IQueryable 类型隐式转换为 System.Collections.Generic.IList”。如果我将 IList&lt;SoleColor&gt; soles = 更改为 var soles = 很好,但是分配匿名类型(如 DataSource)时会出现问题,但我认为这可以在查询中修复,所以我在那里得到正确的类型。同样在某些时候,我必须在查询中添加First()FirstOrDafult() 之类的内容,因为我有许多具有相同SoleCode 的记录,并且我只想为每个唯一的SoleCode 保留一个记录。

【问题讨论】:

    标签: c# linq-to-entities anonymous-objects


    【解决方案1】:

    第一:如何只获得每个组的一个结果我已经在上一个问题中向您展示过。结合匿名类型,这将如下所示:

    SoleColorService.All()
                    .GroupBy(t => t.Sole.Code)
                    .Select(g => g.First())
                    .Select(x => new
                    {
                        SoleCode = x.Sole.Code,
                        SoleName = x.Sole.Name),
                        SoleId   = x.SoleID)
                    }); 
    

    第二:如果你需要从你的方法中以强类型的方式返回这个查询的结果,你不能使用匿名类型。您必须创建一个命名类型并使用它:

    public class SoleModel
    {
        private readonly string _code;
        private readonly string _name;
        private readonly int _id;
    
        public SoleModel(string code, string name, int id)
        {
            _code = code;
            _name = name;
            _id = id;
        }
    
        public string Code { get { return _code; } }
        public string Name { get { return _name; } }
        public int Id { get { return _id; } }
    }
    
    SoleColorService.All()
                    .GroupBy(t => t.Sole.Code)
                    .Select(g => g.First())
                    .Select(x => new SoleModel(x.Sole.Code, x.Sole.Name x.SoleID)); 
    

    第三:将匿名类型列表分配给数据源应该可以工作。

    var result = SoleColorService.All()
                                 .GroupBy(t => t.Sole.Code)
                                 .Select(g => g.First())
                                 .Select(x => new
                                 {
                                     SoleCode = x.Sole.Code,
                                     SoleName = x.Sole.Name),
                                     SoleId   = x.SoleID)
                                 }); 
    someControl.DataSource = result;
    

    【讨论】:

    • 谢谢。由于性能问题,我不得不从昨天更改代码。如果Select 中只有 3 个属性,或者至少这就是我进行此修改的原因,它应该可以更快地加载表单。对于唯一记录 - 我试图将First() 放在查询的最后,所以很明显这是我的错误,不知道这个选项.Select(g =&gt; g.First())。这是我使用 LINQ2Entities 或 LINQ2SQL 的第二天,所以我希望你能原谅我不知道 - 关于类型 - 为 DataSource 分配了自定义方法,该方法期望某种类型,这就是我需要它的原因。
    • @Leron:那么,这是否回答了您的问题,或者还有什么不清楚的地方?顺便说一句:选择仅三列很可能不会对您的性能产​​生太大影响,除非 SoleColor 具有大量列或具有大量数据的列。
    • 对不起,我正在尝试您所阅读的内容。我接受了你的回答。我也不确定性能,但这是我的任务,所以……至少我希望学会使用 Linq2Entities。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多