LINQ /ラムダ式を使用して左結合操作を実行する方法の例を教えてもらえますか?LINQを使用した左結合
答えて
MSDNのLINQ to SQL samples pageは、これを実行する方法の例を示しています。コードは、LINQ to Objectsとほぼ同じでなければなりません。
ここでのキーはDefaultIfEmpty
への呼び出しです。
Dim q = From e In db.Employees _
Group Join o In db.Orders On e Equals o.Employee Into ords = Group _
From o In ords.DefaultIfEmpty _
Select New With {e.FirstName, e.LastName, .Order = o}
これをC#に変換する手助けが必要な場合は、尋ねてください。
ここにはLINQのexample of a left joinがあります。例えば
:
IQueryable<aspnet_UsersInRole> q = db.aspnet_Roles
.Select(p => p.aspnet_UsersInRoles
.SingleOrDefault(x => x.UserId == iduser));
はそれが指定されたユーザ(iduserキー)と一致しないヌルで、asp.netメンバーシップからあなたの役割のリストが表示されます
方法I私が好きなのは、OuterCollection.SelectMany()
とInnerCollection.DefaultIfEmpty()
を組み合わせることです。 LINQPadでは、「C#ステートメント」モードを使用して次を実行できます。
var teams = new[]
{
new { Id = 1, Name = "Tigers" },
new { Id = 2, Name = "Sharks" },
new { Id = 3, Name = "Rangers" },
};
var players = new[]
{
new { Name = "Abe", TeamId = 2},
new { Name = "Beth", TeamId = 4},
new { Name = "Chaz", TeamId = 1},
new { Name = "Dee", TeamId = 2},
};
// SelectMany generally aggregates a collection based upon a selector: from the outer item to
// a collection of the inner item. Adding .DefaultIfEmpty ensures that every outer item
// will map to something, even null. This circumstance makes the query a left outer join.
// Here we use a form of SelectMany with a second selector parameter that performs an
// an additional transformation from the (outer,inner) pair to an arbitrary value (an
// an anonymous type in this case.)
var teamAndPlayer = teams.SelectMany(
team =>
players
.Where(player => player.TeamId == team.Id)
.DefaultIfEmpty(),
(team, player) => new
{
Team = team.Name,
Player = player != null ? player.Name : null
});
teamAndPlayer.Dump();
// teamAndPlayer is:
// {
// {"Tigers", "Chaz"},
// {"Sharks", "Abe"},
// {"Sharks", "Dee"},
// {"Rangers", null}
// }
これで実験している間、私は時々あなたが匿名型のインスタンス化にplayer
のヌルチェックを省略することができることを見出しました。私はこれが、データベース上でLINQ-to-SQLを使用していると思います。(これらの配列の代わりに、LINQ-to-objectsや何かにすると思います。)LINQでのヌルチェックの省略は、 SQLへの変換がSQL LEFT OUTER JOIN
に変換されるため、外部アイテムとNULLを結合することになります。 (匿名オブジェクトのプロパティの値はnull可能でなければならないので、を安全に含める場合は、new { TeamId = (int?)player.TeamId }
などが必要です。
よくわかっています。 nullであり、私が得た結果は、この拡張メソッドです(少し想像力で、あなただけの参加、左を作ってそれを変更することができます):
public static class extends
{
public static IEnumerable<T> LefJoinBNull<T, TKey>(this IEnumerable<T> source, IEnumerable<T> Target, Func<T, TKey> key)
{
if (source == null)
throw new ArgumentException("source is null");
return from s in source
join j in Target on key.Invoke(s) equals key.Invoke(j) into gg
from i in gg.DefaultIfEmpty()
where i == null
select s;
}
}
- 1. Linqの左結合と他の結合の変数の使用
- 2. mysqliを使用した左結合の結果のバインド
- 3. ラムダ式を使用して左結合
- 4. Linq式で左外部結合
- 5. Linqのエンティティへの左結合
- 6. 左外側LINQとの結合
- 7. Linq-To-Entitiesに左外部結合
- 8. LINQを使用したSQL結果の結合
- 9. 空のLINQクエリを使用した結果の結合
- 10. レールで結合されたテーブルのモデルを使用して左外部結合
- 11. SQLからLinqへSQL結合ステートメントで 'AND'で左結合
- 12. 左結合フェッチを使用した重複
- 13. サブクエリと左結合を使用したMySQLインデックスの最適化
- 14. 左結合を使用したSQLグループ化
- 15. Entity Framework 4.0で失敗したLinqを使用して結合
- 16. LINQを使用した結合テーブルの照会
- 17. 左外側結合し、Linq To SQL C#.NET 3.5に存在
- 18. Silverlightでエンティティを使用してLINQを結合する場合
- 19. MySQL左結合
- 20. VB.NETでのLINQグループ結合の使用
- 21. linqパッドで左結合を行う方法 -
- 22. この左結合SQLをメソッド構文に変換するLinq
- 23. 複数の左外部結合を持つエンティティへのLinq
- 24. 複数の左結合を持つLINQ where句
- 25. 左の外部結合でSQLをlinqに変換する
- 26. 左外部結合は左結合と同じですか?
- 27. Linq to Entities:結合で見つからないアイテムを取得するための左の結合
- 28. 結合して左結合でデータを取得しない
- 29. LINQへのSQLクエリの変換左外部結合(VB.NET)
- 30. Linq-To-SQLの左外部結合問題
すべてのLINQラムダエクスプレスに乗って – mquander
母はまだではなく、これを見て!。投稿はdownvotesに打ちこみ、実際には有効なもののように見えるので、まともな英語で質問を書き直すと思った。 – Noldorin
@mquander ::::オリジナルのveを読むあなたのコメントは笑いを浮かべました。 – Brian