C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■54843  active reportに関して
□投稿者/ サホ -(2010/11/06(Sat) 11:38:55)

    分類:[C#] 

    Visual Studio 2008 とMySQLの環境にactive reportをインストールして帳票を作成しようと
    しています。

    テーブルの内容をデータセットと連結するところまでは上手くいきましたが、その後、何を
    すれば良いかさっぱりわかりません。。。

    単純にデザインモードで設定までは終わりましたが、プレビュー等をしても何もデータが
    表示されません。。。

    どこへ何を記述すれば良いか?まで教えて頂けると非常に助かります。

    初歩的な質問で申し訳ありませんが、教えて下さい。
親記事 /過去ログ92より / 関連記事表示
削除チェック/

■84991  Re[5]: 動画を静止画で保存
□投稿者/ 774RR -(2017/09/01(Fri) 11:11:37)
    エラーが出ますだけでなくて、そのエラーメッセージを忠実に書き込むのが吉

    ウチでは次のコードで問題なく動いている (VS2005/.NET 2.0/コンソール)
    // 前略
    static void Main(string[] args)
    {
    DateTime dt = DateTime.Now;
    String formatteddate = dt.ToString("yyyyMMddhhmm");
    Console.WriteLine(formatteddate + ".jpg");
    }

    結果は 201709011108.jpg とか。
記事No.84974 のレス /過去ログ145より / 関連記事表示
削除チェック/

■90111  Re[4]: LINQでJOIN時のエラーについて
□投稿者/ レイ -(2019/02/09(Sat) 14:40:01)
    No90109 (WebSurfer さん) に返信

    WebSurferさん

    コメントありがとうございます。

    すいません、環境ですが
    DB:PostgreSQL
    開発環境
    OS :Windows7 32bit
    .NET Framework :4.5
    Visual Studio :Express 2015
    になります。

    >>質問者さんのコードは理解できませんし
    わかりにくくて申し訳ありません。
    今回PGの修正を行っているのですが、
    Linqを扱うのが初めてで、既存コードから流用したり
    ネット検索でヒットしたコードを組み合わせて
    いろいろ試したのみたですが、全く改善しないため、
    困り果てて質問させていただきました。

    やりたいこととしては
    @DBから商品マスタを取得
    ADBから出庫データを取得
     →出庫データには単価が入っていないため、C#の単価取得関数を呼び出す必要があり、
      出庫データをDataTableに格納し、for eachでループしながら
      DataTableに書き出し
    BDataTableを商品コードごとに集計
    C@とBをjoinして、最終結果を出力
    となります。

    WebSurferさんが載せていただいているURLも確認し、
    Castさせてもみたんですが、結果は変わらず。

    出庫データについては、単価を単価マスタから取得する必要があるため、
    一度DataTableにセットし、取得関数を呼び出してセットしています。


記事No.90105 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90112  Re[5]: LINQでJOIN時のエラーについて
□投稿者/ WebSurfer -(2019/02/09(Sat) 14:40:40)
    No90111 (レイ さん) に返信

    エラーを再現できました。原因も分かりました。

    私のレス No90109 のコードは、delivery を含めた test のコード全体を Linq to Entities と
    して SQL に変換することができ、foreach (var x in test) で DB に SQL を投げることができ
    るので問題なかったということのようです。

    delivery に ToList() を適用したあと、それを test の Linq To Entities のコードに組み込
    むと、その形では SQL に変換することができないので、質問者さんと同じエラーとなります。

    質問者さんのコードの deliverycontext は Linq to Object で、そのコードを実行すると即時に
    匿名型のコレクションを取得するはずです。即ち、私のコードの delivery に ToList() を適用
    したのと同じことです。

    質問者さんのコード var test = from a in shohin ... は Linq to Entities ですよね? だか
    ら、匿名型のコレクションが混ざっていると SQL に変換することができなくてエラーになったの
    だと思います。

    No90108 の私のレスで書いた「LINQにも色々 〜SQLに変換されるモノと変換されないモノ」は
    やっぱり関係があったようです。

    解決策は、質問者さんのコードで言うと deliverycontex と test のところのクエリを、

    (1) 両方とも Linq to Entities にする。それができなければ、

    (2) 両方とも Linq to Object にする。

    ・・・ということでよさそうです。
記事No.90105 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90113  Re[5]: LINQでJOIN時のエラーについて
□投稿者/ WebSurfer -(2019/02/09(Sat) 15:08:22)
    No90111 (レイ さん) に返信
    
    ご参考に検証に使ったコードをアップしておきます。
    
    コメントの「// 質問者さんのコードのように DataTable 経由で取得してみる」以降を追加して
    います。読んでもらえば上で説明したことが分かりやすいと思います。
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.Entity;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace ConsoleAppJoinByLinq
    {
        class Program
        {
            static void Main(string[] args)
            {
                NORTHWINDEntities context = new NORTHWINDEntities();
    
                // これは Linq to Entities
                var delivery = from d in context.Order_Details
                               group d by d.ProductID into g
                               orderby g.Key
                               select new
                               {
                                   ItemCode = g.Key,
                                   Count = g.Sum(x => x.Quantity),
                                   SumAmount = g.Sum(x => x.UnitPrice * x.Quantity)
                               };
    
                // これも Linq to Entities
                var test = from p in context.Products
                           join d in delivery
                           on p.ProductID equals d.ItemCode into dGroup
                           from item in dGroup.DefaultIfEmpty()
                           select new
                           {
                               ItemCode = p.ProductID,
                               Name = p.ProductName,
                               Count = item.Count,
                               SumAmount = item.SumAmount
                           };
    
                // delivery を含めた test のコード全体を Linq to Entities として SQL に変換することができ、
                // foreach で DB に SQL を投げることができ るので問題ない。
                foreach (var x in test)
                {
                    Console.WriteLine($"ID: {x.ItemCode}, Name: {x.Name}, Count: {x.Count}, Sum: {x.SumAmount}");
                }
    
                // 質問者さんのコードのように DataTable 経由で取得してみる
                string connString = @"data source=lpc:(local)\sqlexpress;initial catalog=NORTHWIND;integrated security=True;";
                string selectquery = "SELECT [OrderID],[ProductID],[UnitPrice],[Quantity],[Discount] FROM [Order Details]";
                DataTable table = new DataTable();
                using (SqlConnection connection = new SqlConnection(connString))
                {
                    using (SqlCommand command = new SqlCommand(selectquery, connection))
                    {
                        SqlDataAdapter adapter = new SqlDataAdapter(command);
                        adapter.Fill(table);
                    }
                }
    
                // これは Linq to Object
                var delivery2 = from d in table.AsEnumerable()
                                group d by d.Field<int>("ProductID") into g
                                orderby g.Key
                                select new
                                {
                                    ItemCode = g.Key,
                                    Count = g.Sum(x => x.Field<Int16>("Quantity")),
                                    SumAmount = g.Sum(x => x.Field<decimal>("UnitPrice") * x.Field<Int16>("Quantity"))
                                };
    
                // delivery2 は Linq to Enitities ではない匿名型のオブジェクトのコレクション。
                // それを上のような Linq to Entities のクエリに組み込むと SQL に変換できないということで以下のエラーになる。
                // System.NotSupportedException: Unable to create a constant value of type 'Anonymous type'. 
                // Only primitive types or enumeration types are supported in this context.
    
                // 可決策は以下のように両方 Linq to Object とすること。
                var products = context.Products.ToList();
    
                var test2 = from p in products
                            join d in delivery2
                            on p.ProductID equals d.ItemCode into dGroup
                            from item in dGroup.DefaultIfEmpty()
                            select new
                            {
                                ItemCode = p.ProductID,
                                Name = p.ProductName,
                                Count = item.Count,
                                SumAmount = item.SumAmount
                            };
    
                foreach (var x in test2)
                {
                    Console.WriteLine($"ID: {x.ItemCode}, Name: {x.Name}, Count: {x.Count}, Sum: {x.SumAmount}");
                }
            }
        }
    }
    
    結果はいずれも以下の通りとなります。
    
    ID: 1, Name: Chai, Count: 828, Sum: 14277.6000
    ID: 2, Name: Chang, Count: 1057, Sum: 18559.2000
    ID: 3, Name: Aniseed Syrup, Count: 328, Sum: 3080.0000
    ・・・中略・・・
    ID: 77, Name: Original Frankfurter grune Sose, Count: 791, Sum: 9685.0000
記事No.90105 のレス /過去ログ155より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -