【问题标题】:Retrieving data from multiple tables using linq-to-sql使用 linq-to-sql 从多个表中检索数据
【发布时间】:2014-10-21 13:23:16
【问题描述】:

我们需要使用 Linq-to-SQL 在表单上填充一堆控件来检索数据。为了获取数据,我们需要连接几个表。

我们有以下方法:

第一个文件:

public IEnumerable<object> getPRs()
{
    DataContext db = new DataContext();

    var prQuery = (from p in db.Invoice
                   join prd in db.InvoiceDetails on p.ID equals prd.ID
                   join pra in Accounting on p.ID equals pra.ID
                   where 1 == 1
                   orderby p.DownloadDate descending, p.PRNumber, Convert.ToInt32(p.Item)
                   select new
                          {
                              p.ID,
                              DownloadDate = Convert.ToString(p.DownloadDate),
                              p.PRNumber,
                              p.Item,
                              p.Material,
                              p.ClientMaterial,
                              p.Description,
                              p.Client,
                              p.Price,
                              p.UC,
                              prd.Supplier,
                              prd.Duns,
                              prd.RFQ,
                              prd.RFQDate,
                              prd.PO,
                              prd.PODate,
                              POValue = prd.Price * prd.Quantity,
                              pra.SO,
                              pra.SODate,
                              pra.SOValue,
                              pra.GR,
                              pra.GRDate,
                              pra.GI,
                              pra.GIDate,
                              pra.SInvoice,
                              pra.SInvoiceDate,
                              pra.CInvoice,
                              pra.CInvoiceDate,
                              p.isActive
                          }).ToList();
    return prQuery;
}

我们在第二个文件上调用这样的方法:

IEnumerable<object> data = FirstFile.GetPRs();
PRNumberTextBox.Text = data.PRNumber;

最后一行会报错,因为我们无法从数据对象访问PRNumber 成员。为了填写所有文本框,我们如何调用我们的函数并添加必要的信息?

【问题讨论】:

  • IEnumerable&lt;object&gt; 没有 PRNumber 属性。

标签: c# winforms linq-to-sql


【解决方案1】:

您正在返回一个匿名类型。我建议您创建一个模型类来返回您的数据:

public class PRModel
{
    public int ID { get; set; }
    public string DownloadDate { get; set; }
    //etc... you can fill in the rest yourself
}

然后你的查询变成这样:

var prQuery = (from p in db.Invoice
               join prd in db.InvoiceDetails on p.ID equals prd.ID
               join pra in Accounting on p.ID equals pra.ID
               where 1 == 1
               orderby p.DownloadDate descending, p.PRNumber, Convert.ToInt32(p.Item)
               select new PRModel //<---This is the change here
               {
                   ID = p.ID,
                   DownloadDate = Convert.ToString(p.DownloadDate),
                   PRNumber = p.PRNumber,
                   //snipp
               }

最后,您的返回类型现在应该是IEnumerable&lt;PRModel&gt;。此外,由于它是一个枚举(即您可能有 0、1 或许多项),您需要遍历它们:

IEnumerable<PRModel> data = FirstFile.GetPRs();
foreach(var pr in data)
{
    PRNumberTextBox.Text = pr.PRNumber;
}

编辑:

在这种情况下,如果您只想退回单张发票,则更简单。而不是这样做:

select new PRModel
{
    //lots of rows
}

你可以这样做:

select p

这反过来使您的返回类型为IEnumerable&lt;Invoice&gt;

【讨论】:

  • 如果我们有很多表(即 50 个表),我们需要为每个表创建一个类吗?还是我们需要为每个查询创建一个类?
  • 您已经为每个表创建了一个类,即您的实体对象。如果您愿意,可以退回其中一个。
【解决方案2】:

问题
PRNumber 不是IEnumerable&lt;object&gt; 的成员。您需要遍历 IEnumerable 才能访问每个元素。

解决方案:
第二个问题是您将 linq 查询 中的 anonymous types 隐式转换为 object,因此您从 getPRS() 获得的列表中的每个元素都将是一个 object .如果不强制转换为特定类型(根据 @DavidG 解决方案 - 每个聚合函数的新类/类型)或在运行时使用 dynamic 定义类型,则无法访问属性。 最简单的解决方法是将返回类型更改为IEnumerable&lt;dynamic&gt;

public IEnumerable<dynamic> GetList()
        {
            var list = new List<int> {1, 2, 3, 4};
            return (from i in list
                   select new {
                       Integer = i,
                       Str = "Str" + i
                   }).ToList();
        }

然后:

var items = GetList();
Console.WriteLine(items.First().Integer); // prints "1" to console

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多