1

テーブルから 3 つの列のみを返す LINQ2Entity クエリを記述し、結果を として設定しようとしていDataSourceます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()orのようなものFirstOrDafult()を y クエリに追加する必要があります。これは、同じレコードが多数あり、SoleCodeunique ごとに 1 つだけ保持したいためですSoleCode

4

1 に答える 1

2

最初: グループごとに 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)
                }); 

2 番目: このクエリの結果をメソッドから厳密に型指定された方法で返す必要がある場合は、匿名型を使用できません。名前付きの型を作成し、代わりにそれを使用する必要があります。

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

3 番目: 匿名型のリストをデータソースに割り当てるとうまくいくはずです。

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 に答える