1

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

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

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)
                    }); 

这导致.Select使用以下文本“无法将类型 System.Linq.IQueryable 隐式转换为 System.Collections.Generic.IList”标记为错误。如果我IList<SoleColor> soles =改为var soles =它很好,但是分配匿名类型(如 DataSource)时会出现问题,但我认为这可以在查询中修复,所以我在那里得到正确的类型。另外在某些时候我必须添加类似First()orFirstOrDafult()到 y 查询,因为我有许多相同的记录,SoleCode我只想为每个 unique 保留一个SoleCode

4

1 回答 1

2

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

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;
于 2013-03-22T09:09:00.080 回答