英文:
Using LinQ to access multiple tables. What is the correct way to join these tables with LinQ to be the same as SQL Query?
问题
I am trying to access all the tables in the data warehouse that I created for an experimental project using Lin-Q and I just don't seem to understand how to access every table regarding the data structure, but can easily query using SQL Server to get my results. I can access the DimLocation table, but none of the others. I think in the controller is the right approach, but don't know how to select each column of every table using Lin-Q. Any help would be greatly appreciated!
My Program: [GlobalCommandCenter][1]
SQL Query Result Join Tables:
[![enter image description here][2]][2]
Tables To Join From Entities Framework:
[![enter image description here][3]][3]
LinQ I Created to Join Tables (Need help to join all tables as SQL):
[![enter image description here][4]][4]
I can use one table and it works just fine, but I get this error when I try to do multiple tables as Michael describes to do.
[![enter image description here][5]][5]
Added multiple joins code in the controller:
LocationDatas = (List<DimLocation>)(from c in entities.DimLocations
join f in entities.FactInventories
on c.LocationId equals f.LocationId
join p in entities.DimProductInventories
on f.ProductId equals p.ProductId
join dd in entities.DimDates
on f.DateSK equals dd.DateSK
join dt in entities.DimTimes
on f.TimeSK equals dt.TimeSK
where c.ContinentName == continent && c.CountryName == country
&& c.CountryName == c.CountryName && c.ContinentName == c.ContinentName
&& c.ContinentName == continent || string.IsNullOrEmpty(continent) || string.IsNullOrEmpty(country)
&& c.ContinentName == continent
select new
{
c.LocationId,
c.ContinentName,
c.CountryName,
c.RegionName,
c.CityName,
p.ProductName,
f.ProductPrice,
f.ProductQty,
dd.StandardDate,
dt.StandardTime
}),
Error I get after adding multiple joins code:
[![enter image description here][6]][6]
I edited the call to the model, did away with the bracket and added a semicolon at the very end of it. I then added var to each output with a semi colon at the very end of each statement. After that I get errors on the view.
[![Error Controller Problem][7]][7]
Compilation Error on View (IEnumerable Compatible Error in Razor View?):
[![Compilation Error on View][8]][8]
SQL Query:
SELECT ContinentName, CountryName, RegionName, CityName, ProductName,
finv.ProductPrice,
finv.ProductQty, StandardDate, StandardTime
FROM DimLocation dloc
INNER JOIN FactInventory finv ON finv.LocationId = dloc.LocationId
INNER JOIN DimProductInventory dprod ON finv.ProductId = dprod.ProductId
INNER JOIN DimDate ddat ON finv.DateSK = ddat.DateSK
INNER JOIN DimTime dtim ON finv.TimeSK = dtim.TimeSK
SELECT * FROM FactInventory
SELECT * FROM DimLocation
SELECT * FROM DimDate
SELECT * FROM DimTime
SELECT * FROM DimProductInventory
Controller:
using ClassLibraryDAL.DAL;
using OperationsCommandCenter.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace OperationsCommandCenter.Controllers
{
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
CommandCenterModel model = PopulateModel(null, null);
return View(model);
}
//Controls DropDownList.
[HttpPost]
public ActionResult Index(string continent, string country)
{
CommandCenterModel model = PopulateModel(continent, country);
return View(model);
}
//Population Controller. References list selection.
public static CommandCenterModel PopulateModel(string continent, string country)
{
using (GlobalCommandCenter3Entities entities = new GlobalCommandCenter3Entities())
{
CommandCenterModel model = new CommandCenterModel()
{
//Join all the tables together and extract the information into one web grid.
LocationDatas = (from c in entities.DimLocations
join f in entities.FactInventories
on c.LocationId equals f.LocationId
join p in entities.DimProductInventories
on f.ProductId equals p.ProductId
join dd in entities.DimDates
on f.DateSK equals dd.DateSK
join dt in entities.DimTimes
on f.TimeSK equals dt.TimeSK
where c.ContinentName == continent && c.CountryName == country && c.CountryName == c.CountryName
&& c.ContinentName == c.ContinentName && c.ContinentName == continent || string.IsNullOrEmpty(continent) ||
string.IsNullOrEmpty(country) && c.ContinentName == continent
select c).ToList(),
Country = (from c in entities.DimLocations
orderby c.CountryName
where !string.IsNullOrEmpty(c.CountryName) && c.CountryName != null && continent == c.ContinentName
select new SelectListItem { Text = c.CountryName, Value = c.CountryName }).Distinct().ToList(),
Continent = (from c in entities.DimLocations
orderby c.ContinentName
where (c.ContinentName == c.ContinentName)
select new SelectListItem { Text = c.ContinentName, Value = c.ContinentName }).Distinct().ToList(),
/*
Location = (from c in entities.DimLocations
join f in entities.FactInventories
on c.LocationId equals f.LocationId
join p in entities.DimProductInventories
on f.ProductId equals p.ProductId
join dd in entities.DimDates
on f.DateSK equals dd.DateSK
join dt in entities.DimTimes
on f.TimeSK equals dt.TimeSK
where c.ContinentName == continent && c.CountryName == country && c.CountryName == c.CountryName
&& c.ContinentName == c.ContinentName && c.ContinentName == continent || string.IsNullOrEmpty(continent) ||
string.IsNullOrEmpty(country) && c.ContinentName == continent
select new { c.ContinentName, c.CountryName, c.RegionName, c.CityName, f.ProductPrice,
f.ProductQty, dd.StandardDate, dt.StandardTime }).ToList(),
*/
};
//Allow to stay on selection.
model.SectionCity = continent;
return model;
}
}
}
}
Model:
using ClassLibraryDAL.DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace OperationsCommandCenter.Models
{
public class CommandCenterModel
{
public List<DimLocation> LocationDatas { get; set; }
public List<DimProductInventory> ProductInventory { get; set; }
public List<SelectListItem> Country { get; set; }
public List<SelectListItem> Continent { get; set; }
public List<SelectListItem> ProductName { get;
<details>
<summary>英文:</summary>
I am trying to access all the tables in the data warehouse that I created for an experimental project using Lin-Q and I just don't seem to understand how to access every table regarding the data structure, but can easily query using SQL Server to get my results. I can access the DimLocation table, but none of the others. I think in the controller is the right approach, but don't know how to select each column of every table using Lin-Q. Any help would be greatly appreciated!
My Program: [GlobalCommandCenter][1]
SQL Query Result Join Tables:
[![enter image description here][2]][2]
Tables To Join From Entities Framework:
[![enter image description here][3]][3]
LinQ I Created to Join Tables (Need help to join all tables as SQL):
[![enter image description here][4]][4]
I can use one table and it works just fine, but I get this error when I try to do multiple tables as Michael describes to do.
[![enter image description here][5]][5]
Added multiple joins code in the controller:
LocationDatas = (List<DimLocation>)(from c in entities.DimLocations
join f in entities.FactInventories
on c.LocationId equals f.LocationId
join p in entities.DimProductInventories
on f.ProductId equals p.ProductId
join dd in entities.DimDates
on f.DateSK equals dd.DateSK
join dt in entities.DimTimes
on f.TimeSK equals dt.TimeSK
where c.ContinentName == continent && c.CountryName == country
&& c.CountryName == c.CountryName && c.ContinentName == c.ContinentName
&& c.ContinentName == continent || string.IsNullOrEmpty(continent) || string.IsNullOrEmpty(country)
&& c.ContinentName == continent
select new
{
c.LocationId,
c.ContinentName,
c.CountryName,
c.RegionName,
c.CityName,
p.ProductName,
f.ProductPrice,
f.ProductQty,
dd.StandardDate,
dt.StandardTime
}),
Error I get after adding multiple joins code:
[![enter image description here][6]][6]
I edited the call to the model, did away with the bracket and added a semicolon at the very end of it. I then added var to each output with a semi colon at the very end of each statement. After that I get errors on the view.
[![Error Contoller Problem][7]][7]
Compilation Error on View (IEnumerable Compatible Error in Razor View?):
[![Compilation Error on View][8]][8]
public static CommandCenterModel PopulateModel(string continent, string country)
{
using (GlobalCommandCenter3Entities entities = new GlobalCommandCenter3Entities())
{
**CommandCenterModel model = new CommandCenterModel()
{**
//Join all the tables together and extract the information into one web grid.
LocationDatas = (from c in entities.DimLocations
join f in entities.FactInventories
on c.LocationId equals f.LocationId
join p in entities.DimProductInventories
on f.ProductId equals p.ProductId
join dd in entities.DimDates
on f.DateSK equals dd.DateSK
join dt in entities.DimTimes
on f.TimeSK equals dt.TimeSK
where c.ContinentName == continent && c.CountryName == country && c.CountryName == c.CountryName
&& c.ContinentName == c.ContinentName && c.ContinentName == continent || string.IsNullOrEmpty(continent)
|| string.IsNullOrEmpty(country) && c.ContinentName == continent
select c).ToList(),
Country = (from c in entities.DimLocations
orderby c.CountryName
where !string.IsNullOrEmpty(c.CountryName) && c.CountryName != null && continent == c.ContinentName
select new SelectListItem { Text = c.CountryName, Value = c.CountryName }).Distinct().ToList(),
Continent = (from c in entities.DimLocations
orderby c.ContinentName
where (c.ContinentName == c.ContinentName)
select new SelectListItem { Text = c.ContinentName, Value = c.ContinentName }).Distinct().ToList(),
/*
Location = (from c in entities.DimLocations
join f in entities.FactInventories
on c.LocationId equals f.LocationId
join p in entities.DimProductInventories
on f.ProductId equals p.ProductId
join dd in entities.DimDates
on f.DateSK equals dd.DateSK
join dt in entities.DimTimes
on f.TimeSK equals dt.TimeSK
where c.ContinentName == continent && c.CountryName == country && c.CountryName == c.CountryName && c.ContinentName == c.ContinentName && c.ContinentName == continent || string.IsNullOrEmpty(continent) || string.IsNullOrEmpty(country) && c.ContinentName == continent
select new { c.ContinentName, c.CountryName, c.RegionName, c.CityName, f.ProductPrice, f.ProductQty, dd.StandardDate, dt.StandardTime }).ToList(),
*/
};
//Allow to stay on selection.
model.SectionCity = continent;
return model;
}
}
SQL Query:
SELECT ContinentName, CountryName, RegionName, CityName, ProductName,
finv.ProductPrice,
finv.ProductQty, StandardDate, StandardTime
FROM DimLocation dloc
INNER JOIN FactInventory finv ON finv.LocationId = dloc.LocationId
INNER JOIN DimProductInventory dprod ON finv.ProductId = dprod.ProductId
INNER JOIN DimDate ddat ON finv.DateSK = ddat.DateSK
INNER JOIN DimTime dtim ON finv.TimeSK = dtim.TimeSK
SELECT * FROM FactInventory
SELECT * FROM DimLocation
SELECT * FROM DimDate
SELECT * FROM DimTime
SELECT * FROM DimProductInventory
Controller:
using ClassLibraryDAL.DAL;
using OperationsCommandCenter.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace OperationsCommandCenter.Controllers
{
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
CommandCenterModel model = PopulateModel(null, null);
return View(model);
}
//Controls DropDownList.
[HttpPost]
public ActionResult Index(string continent, string country)
{
CommandCenterModel model = PopulateModel(continent, country);
return View(model);
}
//Population Controller. References list selection.
public static CommandCenterModel PopulateModel(string continent, string country)
{
using (GlobalCommandCenter3Entities entities = new
GlobalCommandCenter3Entities())
{
CommandCenterModel model = new CommandCenterModel()
{
//Join all the tables together and extract the information into one web
grid.
LocationDatas = (from c in entities.DimLocations
join f in entities.FactInventories
on c.LocationId equals f.LocationId
join p in entities.DimProductInventories
on f.ProductId equals p.ProductId
join dd in entities.DimDates
on f.DateSK equals dd.DateSK
join dt in entities.DimTimes
on f.TimeSK equals dt.TimeSK
where c.ContinentName == continent && c.CountryName ==
country && c.CountryName == c.CountryName && c.ContinentName == c.ContinentName
&& c.ContinentName == continent || string.IsNullOrEmpty(continent) ||
string.IsNullOrEmpty(country) && c.ContinentName == continent
select c).ToList(),
Country = (from c in entities.DimLocations
orderby c.CountryName
where !string.IsNullOrEmpty(c.CountryName) && c.CountryName
!= null && continent == c.ContinentName
select new SelectListItem { Text = c.CountryName, Value =
c.CountryName }).Distinct().ToList(),
Continent = (from c in entities.DimLocations
orderby c.ContinentName
where (c.ContinentName == c.ContinentName)
select new SelectListItem { Text = c.ContinentName,
Value = c.ContinentName }).Distinct().ToList(),
/*
Location = (from c in entities.DimLocations
join f in entities.FactInventories
on c.LocationId equals f.LocationId
join p in entities.DimProductInventories
on f.ProductId equals p.ProductId
join dd in entities.DimDates
on f.DateSK equals dd.DateSK
join dt in entities.DimTimes
on f.TimeSK equals dt.TimeSK
where c.ContinentName == continent && c.CountryName ==
country && c.CountryName == c.CountryName && c.ContinentName == c.ContinentName
&& c.ContinentName == continent || string.IsNullOrEmpty(continent) ||
string.IsNullOrEmpty(country) && c.ContinentName == continent
select new { c.ContinentName, c.CountryName,
c.RegionName, c.CityName, f.ProductPrice, f.ProductQty, dd.StandardDate,
dt.StandardTime }).ToList(),
*/
};
//Allow to stay on selection.
model.SectionCity = continent;
return model;
}
}
}
}
Model:
using ClassLibraryDAL.DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace OperationsCommandCenter.Models
{
public class CommandCenterModel
{
public List<DimLocation> LocationDatas { get; set; }
public List<DimProductInventory> ProductInventory { get; set; }
public List<SelectListItem> Country { get; set; }
public List<SelectListItem> Continent { get; set; }
public List<SelectListItem> ProductName { get; set; }
//public List<DimLocation> Location { get; set; }
public string SectionCity { get; set; }
}
}
View:
@model OperationsCommandCenter.Models.CommandCenterModel
@{
ViewBag.Title = "Home Page";
string Country = Model.Country.ToString();
string SectionCity = Model.SectionCity;
WebGrid webGrid = new WebGrid(source: Model.LocationDatas, canPage: true, canSort:
true, sortDirectionFieldName: "ContinentName, CountryName, RegionName, CityName",
rowsPerPage: 20);
webGrid.Pager(WebGridPagerModes.All);
}
<!DOCTYPE html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Global Command Center</title>
<link href="@Url.Content("~/Content/YardDogStyle.css")" rel="stylesheet" type="text/css"
/>
<link href="@Url.Content("~/Scripts/jquery-3.4.1.min.js")" rel="stylesheet"
type="text/css" />
<link href="@Url.Content("~/Scripts/bootstrap.min.js")" rel="stylesheet" type="text/css"
/>
<script src="~/Scripts/bootstrap.min.js"></script>
<script src="~/Scripts/jquery-3.4.1.min.js"></script>
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="~/Scripts/jquery-1.4.1.min.js"></script>
<link href="~/Content/YardDogStyle.css" rel="stylesheet" />
</head>
<body>
<div id="time"></div>
<div id="RowCount"></div>
<SCRIPT LANGUAGE="Javascript">
function checkTime(i) {
if (i < 10) {
i = "0" + i;
}
return i;
}
function startTime() {
var today = new Date();
var h = today.getHours();
var m = today.getMinutes();
var s = today.getSeconds();
// add a zero in front of numbers<10
m = checkTime(m);
s = checkTime(s);
document.getElementById('time').innerHTML = h + ":" + m + ":" + s; //Get the
time.
document.getElementById('time').innerHTML = "Date: " + today; //Get the Date.
t = setTimeout(function () {
startTime()
}, 500);
}
startTime();
</SCRIPT>
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="Scripts/ScrollableGridPlugin.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
$('#<%=webGrid.ClientID %>').Scrollable({
ScrollHeight: 300
});
$('#<%=webGrid.ClientID %>').Scrollable({
ScrollHeight: 300
});
});
</script>
<script src="Scripts/ScrollableGridPlugin.js" type="text/javascript"></script>
<script src="~/Scripts/ScrollableGridPlugin.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$('#<%=webGrid.ClientID %>').Scrollable({
ScrollHeight: 300,
Width: 467
});
});
</script>
<script type="text/javascript">
//Count the rows on the webGrid that are visible... is my intent with this code.
function CountRows() {
var totalRowCount = 0;
var rowCount = 0;
var gridView = document.getElementById("<%=webGrid.ClientID %>");
var rows = gridView.getElementsByTagName("tr")
for (var i = 0; i < rows.length; i++) {
totalRowCount++;
if (rows[i].getElementsByTagName("td").length > 0) {
rowCount++;
}
}
var message = "Total Row Count: " + totalRowCount;
message += "\nRow Count: " + rowCount;
//alert(message);
message = document.getElementById('RowCount').innerHTML = message;
// return false;
}
CountRows();
</script>
<form id="formYardDog" class="formYardDog" runat="server" method="post">
@{ int firstRecord = (webGrid.PageIndex * webGrid.RowsPerPage) + 1;
int lastRecord = (webGrid.PageIndex * webGrid.RowsPerPage) + webGrid.Rows.Count;
// webGrid.Rows..GetRowCount(DataGridViewElementStates.Visible);
}
<div id="RowCountTop"><b>Records: @firstRecord - @lastRecord of
@webGrid.TotalRowCount</b></div><br />
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { @Id = "formYardDog"
}))
{
//Loop to Get Dictionary List Buttons with Distinct Section Values.
for (int i = 0; i < Model.Continent.Count; i++)
{
//If the SectionCity is not null, then back-ground color to red.
if (@Model.Continent[i].Value == SectionCity)
{
<button name="@Html.NameFor(model => model.Continent)"
value="@Model.Continent[i].Value" id="ddlSectionButtons" runat="server" , new {
class="ddlSectionButtons" onClick="focusMe(this);" style="background-color:
#AFE1AF; color: black" }>@Model.Continent[i].Value</button>
}
else
{
// var Count = i;
<!-- <input type="submit" name="Html.NameFor(model => model.Section)"
value=Model.Section[i].Value id="ddlSectionButtons" , new {
class="ddlSectionButtons" onClick="focusMe(this);" }/> -->
<button name="@Html.NameFor(model => model.Continent)"
value="@Model.Continent[i].Value" id="ddlSectionButtons" runat="server" , new {
class="ddlSectionButtons" onClick="focusMe(this);"
}>@Model.Continent[i].Value</button>
}
}
if (SectionCity == null || SectionCity == "")
{
<button text="All" type="submit" name="@Html.NameFor(model =>
model.Continent)" , new { onClick="focusMe(this);" id="ddlSectionAllButton"
class="ddlSectionAllButton" placeholder="All" style="background-color: #AFE1AF;
color: black" })>All</button>
}
else
{
<button text="All" type="submit" name="@Html.NameFor(model =>
model.Continent)" , new { onClick="focusMe(this);" id="ddlSectionAllButton"
class="ddlSectionButtons" placeholder="All" style="background-color: #045AC6;
color: white" })>All</button>
}
<br />
//Section == Country //ContinentLocation == PlantLocation
@Html.DropDownListFor(model => model.Continent, Model.Continent, "- Continent -
", new { onchange = "document.forms[0].submit();", @id = "ddlWarehouses", @class =
"ddlWarehouses" })
@Html.DropDownListFor(model => model.Country, Model.Country, " - Country -", new
{ onchange = "document.forms[0].submit();", @id = "ddlSection", @class =
"ddlSection" })
<div id="content">
@webGrid.GetHtml(tableStyle: "webgrid-table",
headerStyle: "webgrid-header",
footerStyle: "webgrid-footer",
//alternatingRowStyle: "webgrid-alternating-row",
selectedRowStyle: "webgrid-selected-row",
rowStyle: "webgrid-row-style",
mode: WebGridPagerModes.All,
htmlAttributes: new { @id = "webGrid" },
columns: webGrid.Columns(
webGrid.Column(header: "Actions", format:@<span class="link">
<a href="#" class="collapse expand-btn">Expand</a>
<a href="#" class="expand collapse-btn">Collapse</a>
<!--
<a class="Edit" href="javascript:;">Edit</a>
<a class="Clear" href="javascript:;">Clear</a>
<a class="Update" href="javascript:;" style="display:none">Update</a>
<a class="Cancel" href="javascript:;" style="display:none">Cancel</a>
-->
</span>),
webGrid.Column(columnName: "Country", header: "Country", format: @<div>
<label id="ContinentLbl" class="label"><a id="CountryNameLnk"
href="javascript:;">@item.ContinentName</a></label>
<!--- <input id="Location" class="text" type="text" value="item.CountryName"
style="display:none" onkeyup="this.value = this.value.toUpperCase();"/> -->
<br />
<label id="CountryLbl" ><a id="RegioNameLnk" href="#" class="collapse
expand-btn" >@item.CountryName</a></label>
<br />
<label id="RegionLbl" ><a id="CityNameLnk"href="#" class="collapse expand-
btn" >@item.RegionName</a></label>
<br />
<label id="CityLbl" class="expand collapse" >@item.CityName</label>
</div>, style: "CountryName"),
webGrid.Column(header: "RowPageID", format: @<div>
<label id="LocationIDLbl" class="label">@item.LocationID</label>
</div>, style: "LocationID"))),
<div id="RowCountBpttom"><b>Records: @firstRecord - @lastRecord of
@webGrid.TotalRowCount</b></div>
</div>
<br />
<div class="WebGridTable">
</div>
}
</form>
<script type="text/javascript"
src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript"
src="https://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js"></script>
<script src="~/Scripts/YardDog.js"></script>
<script type="text/javascript">
//Expand the Nodes.
$(function () {
$('.expand').hide(); // Default - hide the table row of Course information
// and also hide the Collapse text from
// Student information's action column
$('.expand-btn, .collapse-btn').on("click", function () {
var tr = $(this).parents('tr:first');
tr.find('.expand, .collapse').toggle(); // toggle to display either
Expand or
// Collapse text in the Student row
tr.next().toggle(); // toggle to display table row with Course
information
});
});
</script>
</body>
[1]: https://drive.google.com/file/d/1DP9vY4RdS9LcJJWqDt6G-DtRgKsEnOo2/view
[2]: https://i.stack.imgur.com/hwhSH.jpg
[3]: https://i.stack.imgur.com/A1i94.jpg
[4]: https://i.stack.imgur.com/e4fDA.jpg
[5]: https://i.stack.imgur.com/vlZ4y.jpg
[6]: https://i.stack.imgur.com/mN7p0.jpg
[7]: https://i.stack.imgur.com/v94A5.jpg
[8]: https://i.stack.imgur.com/2Jeto.jpg
</details>
# 答案1
**得分**: 0
获取自定义投影作为查询结果,您可以选择将其选择为匿名类或创建另一个DTO用于此。
由于您的代码是截图,无法复制,因此以下是修剪过的示例:
```csharp
var customProjection = from c in entities.DimLocations
join f in entities.FactInventories
on c.LocationId equals f.LocationId
select new {
c.ContinentName,
f.ProductPrice
}
通过这种方式,您可以访问来自不同表的字段。
英文:
To get a custom projection as a result of the query you can either select it to an anonymous class or create another DTO for this.
Trimmed example (due to your code being a screenshot - I can't copy it):
var customProjection = from c in entities.DimLocations
join f in entities.FactInventories
on c.LocationId equals f.LocationId
select new {
c.ContinentName,
f.ProductPrice
}
This way you can access fields from different tables.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论