如何在不使用join-on-equals-into子句的情况下在C#LINQ中对对象执行左外连接?有没有办法用where条款做到这一点?正确的问题:对于内连接很容易,我有这样的解决方案
List<JoinPair> innerFinal = (from l in lefts from r in rights where l.Key == r.Key
select new JoinPair { LeftId = l.Id, RightId = r.Id})
Run Code Online (Sandbox Code Playgroud)
但对于左外连接我需要一个解决方案.我是这样的,但它不起作用
List< JoinPair> leftFinal = (from l in lefts from r in rights
select new JoinPair {
LeftId = l.Id,
RightId = ((l.Key==r.Key) ? r.Id : 0
})
Run Code Online (Sandbox Code Playgroud)
JoinPair是一个类:
public class JoinPair { long leftId; long rightId; }
Run Code Online (Sandbox Code Playgroud) 此查询是否等同于LEFT OUTER连接?
//assuming that I have a parameter named 'invoiceId' of type int
from c in SupportCases
let invoice = c.Invoices.FirstOrDefault(i=> i.Id == invoiceId)
where (invoiceId == 0 || invoice != null)
select new
{
Id = c.Id
, InvoiceId = invoice == null ? 0 : invoice.Id
}
Run Code Online (Sandbox Code Playgroud) 我有一个linq连接查询wriiten,我想取值,如果其中一个是空的...
码:
var Details =
UnitOfWork.FlightDetails
.Query()
.Join
(
PassengersDetails,
x => x.Flightno,
y => y.FlightNo,
(x, y) => new
{
y.PassengerId,
y.classType,
x.Flightno,
x.FlightName,
}
);
Run Code Online (Sandbox Code Playgroud)
我想用...
"Above query".DefaultIfEmpty
(
new
{
y.PassengerId,
y.classType,
string.Empty,
string.Empty
}
);
Run Code Online (Sandbox Code Playgroud)
"FlightDetails"是类上的Idatarepository类型,"PassengerDetails"是可查询的局部变量结果.如何获得乘客ID和Classtype的结果,并且整体结果中不包含flightno和flightname.
可能重复:
如何使用linq扩展方法执行左外连接
我找不到Linq lambda的左外连接示例(使用扩展方法),至少不是一个明确的.
假设我有下表:
Parent
{
PID // PK
}
Child
{
CID // PK
PID // FK
Text
}
Run Code Online (Sandbox Code Playgroud)
我想加入Parent with Child,对于每个失踪的孩子,我希望Text的默认值为"[[Empty]]".我怎么能用linq lambda语法做到这一点?
我目前有以下内容:
var source = lParent.GroupJoin(
lChild,
p => p.PID,
c => c.PID,
(p, g) =>
new // ParentChildJoined
{
PID = p.PID;
// How do I add child values here?
});
Run Code Online (Sandbox Code Playgroud) 我试图在这里模仿左外连接,但使用动态linq扩展方法.是)我有的:
public static IQueryable SelectMany(this IQueryable source, string selector,
string resultsSelector, params object[] values)
{
if (source == null) throw new ArgumentNullException("source");
if (selector == null) throw new ArgumentNullException("selector");
// Parse the lambda
LambdaExpression lambda = DynamicExpression.ParseLambda(
source.ElementType, null, selector, values);
// Fix lambda by recreating to be of correct Func<> type in case
// the expression parsed to something other than IEnumerable<T>.
// For instance, a expression evaluating to List<T> would result
// in a …Run Code Online (Sandbox Code Playgroud) 我试图用返回类型实现左外连接扩展方法IQueryable.
我写的功能如下
public static IQueryable<TResult> LeftOuterJoin2<TOuter, TInner, TKey, TResult>(
this IQueryable<TOuter> outer,
IQueryable<TInner> inner,
Func<TOuter, TKey> outerKeySelector,
Func<TInner, TKey> innerKeySelector,
Func<TOuter, TInner, TResult> resultSelector)
{
return
from outerItem in outer
join innerItem in inner on outerKeySelector(outerItem)
equals innerKeySelector(innerItem) into joinedData
from r in joinedData.DefaultIfEmpty()
select resultSelector(outerItem, r);
}
Run Code Online (Sandbox Code Playgroud)
它无法生成查询.原因可能是:我用过Func<>而不是Expression<>.我也尝试过Expression<>.它给我一个在线错误outerKeySelector(outerItem),这outerKeySelector是一个被用作方法的变量
我发现了一些关于SO(比如这里)和CodeProjects的讨论,但那些适用于IEnumerable不适合的类型IQueryable.
我有2个相同类型的列表.左侧列表:
var leftList = new List<Person>();
leftList.Add(new Person {Id = 1, Name = "John", Changed = false});
leftList.Add(new Person {Id = 2, Name = "Alice", Changed = false});
leftList.Add(new Person {Id = 3, Name = "Mike", Changed = false});
Run Code Online (Sandbox Code Playgroud)
正确的清单:
var rightList = new List<Person>();
rightList.Add(new Person {Id = 1, Name = "John", Changed = false});
rightList.Add(new Person {Id = 3, Name = "Mike", Changed = true});
rightList.Add(new Person {Id = 4, Name = "Joshi", Changed = true}); …Run Code Online (Sandbox Code Playgroud) 到目前为止,每个人都知道Linq-to-SQL本身不支持多表继承(又称table-per-subtype),并且你可以使用其他ORM框架,如Entity Framework,NHibernate等,如果你想要原生的话支持多表继承(如果您有任何疑问,请参考SO问题" LINQtoSQL中的多重继承 ").
但是,假设您确实想要使用(或仅限于使用)Linq-to-SQL作为您的ORM层,那么任何人都可以确定一个简单而直接的设计策略来模拟 Linq-to-SQL项目中的多表继承,以便客户端代码可以使用自然的,面向对象的API针对Linq-to-SQL层编写?
我有两个表Student和Marks。
学生表具有以下字段:
StudentID, Name, MarkID(Nullable)。
标记表具有以下字段:
MarkID,Mark
学生桌
StudentID Name MarkID
1 Mark 1
2 Mike NULL
3 John NULL
4 Paul 2
Run Code Online (Sandbox Code Playgroud)
标记表
MarkID Mark
1 80
2 100
Run Code Online (Sandbox Code Playgroud)
如果我使用左连接,那么我只会得到mark和paul记录。我想要左表中的所有记录(Student)我的查询是:
var query = (from s in Students
join m in Marks on s.MarkID equals m.MarkID
into mar from subMark in mar.DefaultIfEmpty()
where(m.Mark > 80)
Select s.Name)
.ToList()
Run Code Online (Sandbox Code Playgroud)
注意:这只是一个例子。使用左连接连接两个表并在第二个表上应用 where 条件时,如果第一个表中连接的列值为空,则不会从第一个表中获取记录。
我有tableA和tableB.
我想使用lambda表达式执行左连接.这是相同的sql语句:
SELECT *
FROM tableA A
LEFT JOIN tableB B ON A.userId=B.userId
Run Code Online (Sandbox Code Playgroud)
我怎么能用lambda表达式做到这一点?
我正在尝试针对实体框架核心2.0 DbContext在Linq中实现左外部联接。将查询转换为SQL,而不是在本地进行评估,这一点很重要。我已经查看了几种StackOverflow解决方案,其中包括一个不错的解决方案,但是没有一个使用EF Core。
我得到的问题是EF Core为该DefaultIfEmpty()方法返回以下警告/错误:
The LINQ expression 'DefaultIfEmpty()' could not be translated and will be evaluated locally
如果没有该DefaultIfEmpty()方法,则使用INNER JOIN。我的LINQ查询看起来像这样:
var join = context.Portfolios
.Where(p => p.IsActive)
.GroupJoin(context.BankAccounts,
prt => prt.Id,
bnk => bnk.PortfolioId,
(prt, bnks) => new {Portfolio=prt,Account=bnks.DefaultIfEmpty()})
.SelectMany(r => r.Accounts.DefaultIfEmpty(),
(p, b) => new
{
Id = p.Portfolio.Id,
BankAccount = b.BankAccountNumber,
BankRef = b.BeneficiaryReference,
Code = p.Portfolio.Code,
Description = p.Portfolio.DisplayName
});
Run Code Online (Sandbox Code Playgroud)
有谁知道解决这个问题的方法吗?
c# ×9
linq ×9
.net ×6
linq-to-sql ×3
lambda ×2
.net-core ×1
database ×1
dynamic-linq ×1
join ×1