C# 使用 null 将 SQL 转换为 Linq 左连接
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9171063/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Convert SQL to Linq left join with null
提问by COLD TOLD
How can I convert properly this SQL to linq
如何将此 SQL 正确转换为 linq
select t1.ProgramID
from Program t1 LEFT JOIN ProgramLocation t2 ON t1.ProgramID = t2.ProgramID
where t2.ProgramID IS NULL
I try that but it not working
我试过了,但它不起作用
var progy = (
from u in db.ProgramLocations join b in db.Programs
on u.ProgramID equals b.ProgramID into yG
from y1 in yG.DefaultIfEmpty()
where u.ProgramID == null
where u.ProgramID == null
select u.ProgramID
).ToList();
THANKS
谢谢
采纳答案by LiquidPony
You want to use .DefaultIfEmpty, as per this question.
你想使用.DefaultIfEmpty,按照这个问题。
var query = from p in Programs
join pl in ProgramLocations
on p.ProgramID equals pl.ProgramID into pp
from pl in pp.DefaultIfEmpty()
where pl == null
select p;
Here's a full, working example with some mock data objects:
这是一个带有一些模拟数据对象的完整工作示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinqTest
{
class LinqProgram
{
public class Program
{
public int ProgramID { get; set; }
public string ProgramName { get; set; }
}
public class ProgramLocation
{
public int ProgramLocationID { get; set; }
public int ProgramID { get; set; }
public string ProgramLocationName { get; set; }
}
public static List<Program> Programs = new List<Program>();
public static List<ProgramLocation> ProgramLocations = new List<ProgramLocation>();
static void Main(string[] args)
{
FillTestData();
var query = from p in Programs
join pl in ProgramLocations
on p.ProgramID equals pl.ProgramID into pp
from pl in pp.DefaultIfEmpty()
where pl == null
select p;
foreach (var r in query)
{
Console.WriteLine("{0}: {1}", r.ProgramID, r.ProgramName);
}
Console.ReadLine();
}
private static void FillTestData()
{
var p = new Program()
{
ProgramID = Programs.Count + 1,
ProgramName = "Scary Lesson"
};
var pl = new ProgramLocation()
{
ProgramLocationID = ProgramLocations.Count + 1,
ProgramID = p.ProgramID,
ProgramLocationName = "Haunted House"
};
Programs.Add(p);
ProgramLocations.Add(pl);
p = new Program()
{
ProgramID = Programs.Count + 1,
ProgramName = "Terrifying Teachings"
};
pl = new ProgramLocation()
{
ProgramLocationID = ProgramLocations.Count + 1,
ProgramID = p.ProgramID,
ProgramLocationName = "Mystical Mansion"
};
Programs.Add(p);
ProgramLocations.Add(pl);
p = new Program()
{
ProgramID = Programs.Count + 1,
ProgramName = "Unassociated Program"
};
Programs.Add(p);
}
}
}
回答by Amar Palsapure
Try this
尝试这个
var progy = (
from u in db.ProgramLocations join b in db.Programs
on u.ProgramID equals b.ProgramID into yG
from y1 in yG.DefaultIfEmpty()
where y1 == null
select u.ProgramID
).ToList();
You can check this post on MSDN.
Hope this works for you.
希望这对你有用。
回答by Abe Miessler
Could you use except instead?
你可以用except代替吗?
var progy = (
from u in db.ProgramLocations
select u.ProgramID
).Except(from b in db.Programs select b.ProgramID);
回答by Tapan
SELECT pfa.PetID, pt.PetTypeDesc, pfa.petname, pf.PetOwner, pf.remarks, pat.AdoptedBy
FROM dbo.PetForAdoption pfa
JOIN dbo.PetAdoptionTran pat
ON pfa.PetID = pat.PetID
JOIN dbo.PetTypes pt
ON pfa.PetTypeID = pt.PetTypeID
JOIN dbo.PetProfile pf
ON pfa.PetID = pf.PetID
ORDER BY pt.PetTypeDesc

