Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ到数据集查询帮助_C#_.net_Linq_Datatable_Dataset - Fatal编程技术网

C# LINQ到数据集查询帮助

C# LINQ到数据集查询帮助,c#,.net,linq,datatable,dataset,C#,.net,Linq,Datatable,Dataset,我对林克真的是个新手,所以我希望有人能帮我。我有一个需要运行大型查询的数据库,但它是一个非常旧的ODBC驱动程序,响应时间很长(即使是一个简单的查询也需要30分钟以上)。将所有数据转储到数据集中只需要2-3分钟,因此我认为这是最好的,然后我可以运行LINQ到数据集的查询。我似乎无法让这个问题发挥作用,我有点困惑。我将所有数据放入SQLExpress数据库,以测试LINQtoSQL查询,以确保我走的是正确的道路。我没有这个选项,应用程序将在哪里运行,因为环境总是不同的 SQL: LINQ到SQL:

我对林克真的是个新手,所以我希望有人能帮我。我有一个需要运行大型查询的数据库,但它是一个非常旧的ODBC驱动程序,响应时间很长(即使是一个简单的查询也需要30分钟以上)。将所有数据转储到数据集中只需要2-3分钟,因此我认为这是最好的,然后我可以运行LINQ到数据集的查询。我似乎无法让这个问题发挥作用,我有点困惑。我将所有数据放入SQLExpress数据库,以测试LINQtoSQL查询,以确保我走的是正确的道路。我没有这个选项,应用程序将在哪里运行,因为环境总是不同的

SQL:

LINQ到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)
};
var query=来自ds.Tables[“Invoice_detail”].AsEnumerable()中的详细信息
在ds.Tables[“Product_master”]中联接prodmast。详细信息[“Code”]上的AsEnumerable()等于prodmast[“Code”]
新{docnum=detail[“InternalDocNum”]、doctype=detail[“doctype”]}上的ds.Tables[“Invoice_header”].AsEnumerable()中的联接头等于新{docnum=header[“InternalDocNum”]、doctype=header[“doctype”]}
将ds.Tables[“Alternate_product_codes”]中的prodcodes联接到alt_invd中。详细信息[“Code”]上的AsEnumerable()等于prodcodes[“Code”]
从alt_invd.DefaultIfEmpty()中的prodcodes
哪里
(int)标题[“DocType”]==1&&
(int)详图[“线型”]==1&&
(int)详细信息[“QTYNV”]>0&&
//header.Field(“Date”)>DateTime.Parse(“17/07/2011”)。日期&&
header.Field(“Date”)>DateTime.Now.Date.AddDays(-7)&&
header.Field(“DocNum”).Trim()=“119674”
选择新的
{
代码=详细信息[“代码”],
描述=详细信息[“描述”],
包装=prodmast[“注释”],
库存=详细信息[“QTYNV”],
BO=详细信息[“QtyBackOrder”],
条形码=产品代码[“主条形码”],
价格=详细信息[“价格金额”],
Disc=详图[“DiscPerc”],
净值=数学四舍五入(转换为小数((双精度)细节[“TaxableMat”]/(int)细节[“QTYNV”]),2,中点四舍五入。从零开始计算)
};
我需要运行LINQ到数据集查询,然后将结果放入数据表中,以便导出到CSV。查询将返回许多行,因此我可以看到CopyToDataTable方法,但是除非它是类型化数据集,否则它似乎不起作用。我使用的是ODBC数据适配器填充方法,因此没有在填充的数据表上专门设置数据类型。这样做的原因是这些表中有很多列,设置它们都很耗时

LINQ是最好的选择吗?我接近了吗?我必须为所有列和数据类型设置数据表吗?我唯一能想到的另一种方法是每次将数据转储到access数据库中,然后从那里进行查询。我更想让LINQ工作,因为我认为这对我的未来更有利

感谢您的帮助或指点

谢谢


Pete.

考虑使用POCO对象而不是数据集


如果我理解正确,Linq To数据集查询将检索正确的信息,但您无法将信息导出到csv

如果您只需要使用示例中的九个字段创建一个csv文件,则可以使用csv库(例如)导出信息

为了给你一个额外工作的例子,你需要定义一个类,例如

[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);
你就完了

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