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