0

グループ化された後、製品データ型を返すには、LINQ クエリが必要です。匿名の疑似家族に包まれているようです。

p.ID と p.Name などが必要なだけで、気にしない Product のプロパティがいくつかあります。

これで現時点で発生しているエラーは次のとおりです。

The entity or complex type 'DatabaseModel.Product' cannot be constructed in a LINQ to Entities query.

これは私の方法です:

        public static List<Product> GetSellableSpecialOffers(DatabaseEntities db)
    {

        var query = from p in db.Products
                    where (p.Visible == true && p.Active == true)
                    && p.ShowInSpecialOffers == true
                    group p by p.FamilyID == null ? 0 : p.FamilyID into f
                    select new Product {
                    ID = f.First().ID,
                    Name = f.First().Name,
                    Cost = f.First().Cost,
                    RRP = f.First().RRP
                    };

        return query.ToList();
    }

何が問題ですか?これを回避するより良い方法はありますか?SQL は、オブジェクトをセカンダリ データ型に入れる代わりに、常に 1 つのレコードを返しますが、わかりません。

どうもありがとう、

編集1:

仕様を拡張して申し訳ありませんが、返された製品をプログラムで生成する必要があります。

select new Product {
                    ID = f.First().ID,
                    Name = f.First().Name,
                    Cost = f.OrderBy(p => p.NowCost).FirstOrDefault(),
                    RRP = f.First().RRP
                    }

または、ファミリ クラスを厳密に型指定できる場合:

    public partial class ProductFamily
{
    public Product GroupedProduct 
    {
        get
        {
            return this.Products.OrderBy(p => p.NowCost).FirstOrDefault();
        }
    }
}

それから私はするだろう:

 var query = (from p in db.Products
                    where (p.Visible == true && p.Active == true)
                    && p.ShowInSpecialOffers == true
                    group p by p.ProductFamily == null ? null : p.ProductFamily into f
                     select f.GroupedProduct).ToList<Product>();

しかし、私が持っているもので動作するソリューションを得ることができません。

4

3 に答える 3

1

select f.First()次のように、単純に結果のデータを返すことができます。

var query = from p in db.Products
            where (p.Visible == true && p.Active == true)
            && p.ShowInSpecialOffers == true
            group p by p.FamilyID == null ? 0 : p.FamilyID into f
            select f.First();

次に、メソッドの外部で、必要のないプロパティを無視して、必要なプロパティを使用します(オブジェクト処理しているので、プロパティは必要ない場合でも存在する必要があります)。Product

于 2012-09-04T14:49:44.373 に答える
1

試すことができます(退屈ですが、選択できるかどうかはわかりません)

var query = from p in db.Products
                    where (p.Visible == true && p.Active == true)
                    && p.ShowInSpecialOffers == true
                    group p by p.FamilyID == null ? 0 : p.FamilyID into f
                    select new {
                    ID = f.First().ID,
                    Name = f.First().Name,
                    Cost = f.OrderBy(m => m.NowCost).First().Cost,
                    RRP = f.First().RRP
                    };

return query.ToList().Select(m => 
new Product {
    ID = m.ID,
    Name = m.Name, 
    Cost = m.Cost,
    RRP = m.RRP
};

編集 またはMaster Skeetが指摘したように(あなたが試したものとまったく同じではありませんが、はるかに簡単です)

var query = from p in db.Products
                    where (p.Visible == true && p.Active == true)
                    && p.ShowInSpecialOffers == true
                    group p by p.FamilyID == null ? 0 : p.FamilyID into f
                    select f.OrderBy(m => m.NowCost).First();
于 2012-09-04T14:39:59.080 に答える
0

「製品」という単語をから削除します

select new Product{}

「selectnew」自体は匿名タイプを作成しますが、製品として指定します。

于 2012-09-04T14:38:32.157 に答える