【问题标题】:Linq to SQL joining two tables and populate GridViewLinq to SQL 连接两个表并填充 GridView
【发布时间】:2012-04-25 07:42:44
【问题描述】:

我的数据库中有两个表,Building 和 Town。它们看起来像这样:

建筑:

buildingid
buildingname

城镇:

id
userid
buildingid

在城镇中,用户拥有的每一栋建筑都有一个入口。

我想要的是为具有给定用户 ID 的用户填充 GridView。此 GridView 应包括建筑物名称和建筑物数量。 建造。我试过这个:

var buildings = (from Town in dc.Towns
                         join Building in dc.Buildings
                             on Town.buildingid equals Building.buildingid
                         select Building.buildingname);
        gvBuildings.DataSource = buildings;
        gvBuildings.DataBind();

但我不知道如何获取每个建筑物的编号。


我现在已经为此工作了一段时间,您的一些答案有效。我用过这段代码:

var buildings = dc.Towns
            .Where(t => t.userid == userid)
            .GroupJoin(dc.Buildings,
                       t => t.buildingid,
                       b => b.buildingid,
                       (Town, Buildings) => new
                                                {
                                                    BuildningName = Buildings.First().buildingname,
                                                    Count = Buildings.Count()
                                                });
        gvBuildings.DataSource = buildings.ToList();
        gvBuildings.DataBind();

当我运行这段代码时,我的 GridView 最终看起来像这样:

我需要按组显示建筑物,按建筑物名称分组。我已经尝试了所有建议,但我无法让它发挥作用。

【问题讨论】:

  • 每个建筑物的数量是建筑物的ID还是每个建筑物的数量?
  • @PranayRana 要获得数字,我需要计算城镇中的每个条目,其中 userid == parameterUserId 和 Buildingid == parameterBuildingid
  • 您似乎只需要添加一个 where 条件,因为您已经在建筑物 ID 上应用了 inne 连接 ...
  • 试试我更新的解决方案我的答案可能对你有用...
  • 一些解决方案很有效。但它不会按建筑物名称对结果进行分组。我填充了 GridView,但它的显示如下:军营 1、军营 1、军营 1、马厩 1、射箭 1。

标签: c# asp.net linq-to-sql gridview join


【解决方案1】:

尝试分组:

var buildings = dc.Towns
                  .Where(t => t.UserId == userId)
                  .GroupJoin(dc.Buildings,
                             t => t.BuildingId,
                             b => b.BuildingId,
                             (town, buildings) => new
                             {
                                 BuildingName = buildings.First().BuildingName,
                                 Count = buildings.Count
                             });

请记住,当绑定到控件时,您必须提供类型(或实现)IList 的集合。这可以通过在 buildings 集合上调用 ToList() 来完成:

gvBuildings.DataSource = buildings.ToList();
gvBuildings.DataBind();

【讨论】:

  • 这不会将结果组合在一起。此查询的结果显示在已编辑的问题中。
  • @Twistar,在这种情况下,使用简单的Join,后跟GroupBy
【解决方案2】:

检查linq differed execution

然后尝试使用打击代码可能对您有用

    var buildings = 

(from j in dc.Town 
join i in dc.Buildings
 on j.buildingId equals i.buildingId
where j.Userid = varUSerid 
group new {i, j} 
by new 
{   i.BuildingID } 
into 
g  
select new {   
  BuildingName = g.First<k=>k.BuildingName)
   , count = g.Count() } ).ToList();
    gvBuildings.DataSource = buildings; 
          gvBuildings.DataBind(); 

【讨论】:

    【解决方案3】:
     var buildings = (from Town in dc.Towns
                                     join Building in dc.Buildings
                                         on Town.buildingid equals Building.buildingid
                                     into results
                                     from r in results.DefaultIfEmpty()
                                     group Town by new 
                                     {
                                         r.BuildingId
                                     } into groupedResults
                                     where Town.UserID == parameteruserId
                                     select new 
                                     {
                                         BuildingName = Building.buildingname,
                                         BuildingCount = groupedResults.Count()
                                      });
    

    试试这个..它应该可以工作..我有类似的要求..

    【讨论】:

    • 这一行:BuildingCount = Building.Count() 不起作用。如果我只知道在哪里使用 Count() 语句,这似乎可行。
    • 如果需要按 BuildingId 分组,请查看修改后的查询。
    • Town.UserID == parameteruderId 无法编译的行。它告诉我:无法在静态“上下文”中访问非静态属性“userid”
    • 取出该行并运行代码。它是否将结果绑定到数据网格
    • 已删除该行,但选择语句仍有错误:模糊调用,Building.buildingname 与上述错误相同..
    【解决方案4】:
     manDbDataContext db = new DbDataContext();
    
     var estimatedTotal = (  from est in db.AssignmentEstimatedMaterials
                             where est.assignment_id == Convert.ToInt32(Label_assignmentId.Text)
                             join materialdetail in db.Materials on est.material_id equals materialdetail.material_id
                             select new { est.qty,est.total_amount, materialdetail.material_name}).ToList();
    
        GridView_estiamte_material.DataSource = estimatedTotal;
        GridView_estiamte_material.DataBind();
    

    注意,您应该选择单个数据并且它可以工作。

    【讨论】:

      猜你喜欢
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 2015-11-20
      相关资源
      最近更新 更多