2011-07-23 8 views
0

私はLINQには本当に新しいので、誰かが私を助けることを望んでいます。私は大きなクエリを実行するために必要なデータベースを持っていますが、それは本当に古いODBCドライバであり、応答するのに長い時間がかかります(単純なクエリでも30分以上)。すべてのデータをデータセットにダンプするのに約2〜3分かかりますが、これが最良だとわかりました。その後、LINQ to Datasetクエリを実行できます。私はクエリを動作させるように見えることはできませんし、私はちょっと混乱しています。すべてのデータをSQL Expressデータベースに入れて、LINQ to SQLクエリをテストして、正しいパスを辿っていることを確認してください。環境が常に異なるため、アプリケーションを実行するこのオプションはありません。LINQ to DataSetクエリのヘルプ

SQL:

SELECT Invoice_detail.Code, Invoice_detail.Description, Product_master.Comment AS Packing, Invoice_detail.QtyInv AS INV, Invoice_detail.QtyBackOrder AS BO, Alternate_product_codes.MasterBarCode AS BarCode, Invoice_detail.PriceAmt AS Price, Invoice_detail.DiscPerc AS Disc, ROUND(Invoice_detail.TaxableAmt/Invoice_detail.QtyInv,2) AS Nett FROM ((Invoice_detail INNER JOIN Product_master ON Invoice_detail.Code = Product_master.Code) INNER JOIN Invoice_header ON Invoice_detail.InternalDocNum = Invoice_header.InternalDocNum AND Invoice_detail.DocType = Invoice_header.DocType) LEFT JOIN Alternate_product_codes ON Invoice_detail.Code = Alternate_product_codes.Code WHERE Invoice_header.DocNum = '{0}' AND Invoice_header.DocType = 1 AND Invoice_detail.LineType = 1 AND Invoice_detail.QtyInv > 0 

LINQ to SQLは:データセットへ

from detail in INVOICE_DETAILs 
join prodmast in PRODUCT_MASTERs on detail.Code equals prodmast.Code 
join header in INVOICE_HEADERs on new { detail.InternalDocNum, detail.DocType } equals new { header.InternalDocNum, header.DocType} 
join prodcodes in ALTERNATE_PRODUCT_CODES on detail.Code equals prodcodes.Code into alt_invd 
from prodcodes in alt_invd.DefaultIfEmpty() 
where 
    header.DocType == 1 && 
    detail.LineType == 1 && 
    detail.QtyInv > 0 && 
    header.Date > DateTime.Parse("17/07/2011").Date && 
    header.DocNum.Trim() == "119674" 
select new { 
    detail.Code, 
    detail.Description, 
    Packing = prodmast.Comment, 
    INV = detail.QtyInv, 
    BO = detail.QtyBackOrder, 
    Barcode = prodcodes.MasterBarCode, 
    Price = detail.PriceAmt, 
    Disc = detail.DiscPerc, 
    Nett = Math.Round(Convert.ToDecimal(detail.TaxableAmt/detail.QtyInv),2,MidpointRounding.AwayFromZero) 
} 

LINQ:

var query = from detail in ds.Tables["Invoice_detail"].AsEnumerable() 
join prodmast in ds.Tables["Product_master"].AsEnumerable() on detail["Code"] equals prodmast["Code"] 
join header in ds.Tables["Invoice_header"].AsEnumerable() on new { docnum = detail["InternalDocNum"], doctype = detail["DocType"] } equals new { docnum = header["InternalDocNum"], doctype = header["DocType"] } 
join prodcodes in ds.Tables["Alternate_product_codes"].AsEnumerable() on detail["Code"] equals prodcodes["Code"] into alt_invd 
from prodcodes in alt_invd.DefaultIfEmpty() 
where 
    (int)header["DocType"] == 1 && 
    (int)detail["LineType"] == 1 && 
    (int)detail["QtyInv"] > 0 && 
    //header.Field<DateTime>("Date") > DateTime.Parse("17/07/2011").Date && 
    header.Field<DateTime>("Date") > DateTime.Now.Date.AddDays(-7) && 
    header.Field<string>("DocNum").Trim() == "119674" 
select new 
{ 
    Code = detail["Code"], 
    Description = detail["Description"], 
    Packing = prodmast["Comment"], 
    INV = detail["QtyInv"], 
    BO = detail["QtyBackOrder"], 
    Barcode = prodcodes["MasterBarCode"], 
    Price = detail["PriceAmt"], 
    Disc = detail["DiscPerc"], 
    Nett = Math.Round(Convert.ToDecimal((double)detail["TaxableAmt"]/(int)detail["QtyInv"]), 2, MidpointRounding.AwayFromZero) 
}; 

私は、データセットクエリにLINQを実行し、その後に結果を配置する必要があり私がCSVにエクスポートできるようにDataTable。クエリは多くの行を返すので、CopyToDataTableメソッドを見ることはできますが、型指定されたデータセットでないと動作しないようです。私は、ODBCデータアダプターの充填メソッドを使用しているので、私が充填しているDatatablesのデータ型を特に設定していません。その理由は、それらのテーブルには多くの列があり、すべての列を設定するには時間がかかるからです。

LINQは最適ですか?私は閉じますか?すべての列とデータ型に対してDataTablesを設定する必要がありますか?私が考えることができる唯一の他の方法は、毎回アクセスデータベースにデータをダンプし、そこからクエリを出すことです。私はLINQを動作させるのがより興味深いですが、私が将来的にはより有益になると思うので、

ご意見やご指摘をいただければ幸いです。

ありがとうございました。

Pete。

答えて

1

データセットの代わりにPOCOオブジェクトを使用することを検討してください。私が正しくあなたを理解していれば

Blogs @ MSDN

0

は、LINQのデータセットにクエリは、正しい情報を取得していますが、CSVファイルに情報をエクスポートすることができません。

例の9つのフィールドだけを使用して作成する必要があるcsvファイルが1つの場合は、csvライブラリ(たとえばFileHelpers)を使用して情報をエクスポートできます。

あなたに関係する余分な作業の例を与えるために、あなたはクラス例えば

[DelimitedRecord(",")] 
public class Info 
{ 
    [FieldQuoted()] 
    public string Code ; 
    [FieldQuoted()] 
    public string Description ; 
    [FieldQuoted()] 
    public string Packing ; 
    public decimal INV ; 
    public decimal BO ; 
    [FieldQuoted()] 
    public string Barcode ; 
    public decimal Price ; 
    public decimal Disc ; 
    public decimal Nett ; 

} 

を定義する必要があります(私はフィールドタイプのいくつかを推測している、注意してください)

あなたは、あなたのを変更情報を使用するクエリ、すなわち

select new Info { 
    Code = detail["Code"], 
... 

し、最終的に

FileHelperEngine engine = new FileHelperEngine(typeof(Info)); 
    engine.WriteFile(".\\outputfile.csv", query); 

となりました。