LINQ,我在网站上提出了很多问题.我提出的问题范围广泛而且多种多样,往往背后没有太多背景.因此,为了巩固我在Linq上获得的知识,我发布了这个问题,以便在我继续学习LINQ时使用其他信息来维护和更新它.
我也希望它能够成为想要了解LINQ的其他人的有用资源.
来自MSDN:
LINQ项目是.NET Framework的一组扩展的代号,包含语言集成的查询,设置和转换操作.它使用本机语言语法扩展C#和Visual Basic,并提供类库以利用这些功能.
这意味着LINQ提供了一种使用通用语法查询各种数据源的标准方法.
目前,Microsoft提供了一些不同的LINQ提供程序:
还有很多其他的,其中许多列在这里.
Chook提供了一种输出CSV文件的方法
Jeff显示了如何从数组中删除重复项
Bob 从数据表中获取一个不同的有序列表
Marxidad显示了如何对数组进行排序
Dana获得了使用Linq实现快速排序的帮助
GateKiller的问题链接摘要如下:
Scott Guthrie 在他的博客上为Linq提供了一个介绍MSDN
上LINQ的概述
ChrisAnnODell建议退房:
使用下面的简单示例,使用Linq to SQL从多个表返回结果的最佳方法是什么?
说我有两张桌子:
Dogs: Name, Age, BreedId
Breeds: BreedId, BreedName
Run Code Online (Sandbox Code Playgroud)
我想用他们的狗归还所有的狗BreedName.我应该让所有的狗使用这样的东西没有问题:
public IQueryable<Dog> GetDogs()
{
var db = new DogDataContext(ConnectString);
var result = from d in db.Dogs
join b in db.Breeds on d.BreedId equals b.BreedId
select d;
return result;
}
Run Code Online (Sandbox Code Playgroud)
但如果我想要品种的狗并尝试这个我有问题:
public IQueryable<Dog> GetDogsWithBreedNames()
{
var db = new DogDataContext(ConnectString);
var result = from d in db.Dogs
join b in db.Breeds on d.BreedId equals b.BreedId
select new
{
Name = d.Name,
BreedName = b.BreedName
};
return result; …Run Code Online (Sandbox Code Playgroud) 我在LINQ to SQL示例中看到了很多关于如何在查询语法中进行连接的示例,但我想知道如何使用方法语法来实现它?例如,我如何执行以下操作
var result = from sc in enumerableOfSomeClass
join soc in enumerableOfSomeOtherClass
on sc.Property1 equals soc.Property2
select new { SomeClass = sc, SomeOtherClass = soc }
Run Code Online (Sandbox Code Playgroud)
用一个.Join()?谁能说明或提供另一个简单的例子吗?
当我使用Linq-to SQL将对象输入到数据库中时,是否可以获取刚插入的ID而不进行另一次数据库调用?我假设这很容易,我只是不知道如何.
从可能不返回任何行的LINQ查询中获取Max值的最佳方法是什么?如果我这样做
Dim x = (From y In context.MyTable _
Where y.MyField = value _
Select y.MyCounter).Max
Run Code Online (Sandbox Code Playgroud)
当查询没有返回任何行时,我收到错误.我可以
Dim x = (From y In context.MyTable _
Where y.MyField = value _
Select y.MyCounter _
Order By MyCounter Descending).FirstOrDefault
Run Code Online (Sandbox Code Playgroud)
但对于这样一个简单的请求,这感觉有点迟钝.我错过了一个更好的方法吗?
更新:这是后面的故事:我正在尝试从子表中检索下一个资格计数器(遗留系统,不要让我开始......).每个患者的第一个资格行总是1,第二个是2,等等(显然这不是子表的主键).因此,我正在为患者选择最大现有计数器值,然后向其中添加1以创建新行.当没有现有子值时,我需要查询返回0(因此添加1会给我一个计数器值1).请注意,我不想依赖子行的原始计数,以防遗留应用程序在计数器值中引入间隙(可能).我试图让这个问题过于通用我不好.
假设我有这个SQL:
SELECT p.ParentId, COUNT(c.ChildId)
FROM ParentTable p
LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId
GROUP BY p.ParentId
Run Code Online (Sandbox Code Playgroud)
如何将其转换为LINQ to SQL?我被困在COUNT(c.ChildId),生成的SQL似乎总是输出COUNT(*).这是我到目前为止所得到的:
from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1
from j2 in j1.DefaultIfEmpty()
group j2 by p.ParentId into grouped
select new { ParentId = grouped.Key, Count = grouped.Count() }
Run Code Online (Sandbox Code Playgroud)
谢谢!
我在使用LINQ to SQL找出如何使用多个左外连接时遇到了一些麻烦.我理解如何使用一个左外连接.我正在使用VB.NET.下面是我的SQL语法.
T-SQL
SELECT
o.OrderNumber,
v.VendorName,
s.StatusName
FROM
Orders o
LEFT OUTER JOIN Vendors v ON
v.Id = o.VendorId
LEFT OUTER JOIN Status s ON
s.Id = o.StatusId
WHERE
o.OrderNumber >= 100000 AND
o.OrderNumber <= 200000
Run Code Online (Sandbox Code Playgroud) 我有以下SQL,我试图将其转换为LINQ:
SELECT f.value
FROM period as p
LEFT OUTER JOIN facts AS f ON p.id = f.periodid AND f.otherid = 17
WHERE p.companyid = 100
Run Code Online (Sandbox Code Playgroud)
我已经看到了左外连接的典型实现(即into x from y in x.DefaultIfEmpty()等),但我不确定如何引入其他连接条件(AND f.otherid = 17)
编辑
为什么AND f.otherid = 17条件是JOIN的一部分而不是WHERE子句?因为f某些行可能不存在,我仍然希望包含这些行.如果条件在WHERE子句中应用,在JOIN之后 - 那么我没有得到我想要的行为.
不幸的是:
from p in context.Periods
join f in context.Facts on p.id equals f.periodid into fg
from fgi in fg.DefaultIfEmpty()
where p.companyid == 100 && fgi.otherid == 17
select f.value
Run Code Online (Sandbox Code Playgroud)
似乎等同于:
SELECT …Run Code Online (Sandbox Code Playgroud)