C# 在C中将SQL转换为lambda

C# 在C中将SQL转换为lambda,c#,sql,lambda,C#,Sql,Lambda,如何将以下查询从SQL重新写入C中的lambda?是否建议使用lambda编写 SELECT * FROM Claims WHERE id IN (SELECT claimId FROM MissingItems GROUP BY claimId); 使用LINQ lambdas的等效方法-假设代码中有MissingItem对象的集合,并且代码中有声明的表示 List<String> distinctClaimIds =

如何将以下查询从SQL重新写入C中的lambda?是否建议使用lambda编写

SELECT * 
FROM Claims 
WHERE id IN (SELECT claimId 
             FROM MissingItems 
             GROUP BY claimId);

使用LINQ lambdas的等效方法-假设代码中有MissingItem对象的集合,并且代码中有声明的表示

List<String> distinctClaimIds = missingItems.Select(mi => mi.claimId).Distinct();

List<Claim> claimsWithThoseIds = claims.Where(c => distinctClaimIds.Contains(c.id)).ToList();
为您的一份声明利益编辑:

最接近一个语句,尽管我认为2更具可读性,但我可以想到:

List<Claim> claimsWithThoseIds = claims.Where(c => missingItems.Select(mi => mi.claimId).Distinct().Contains(c.id)).ToList()

使用LINQ lambdas的等效方法-假设代码中有MissingItem对象的集合,并且代码中有声明的表示

List<String> distinctClaimIds = missingItems.Select(mi => mi.claimId).Distinct();

List<Claim> claimsWithThoseIds = claims.Where(c => distinctClaimIds.Contains(c.id)).ToList();
为您的一份声明利益编辑:

最接近一个语句,尽管我认为2更具可读性,但我可以想到:

List<Claim> claimsWithThoseIds = claims.Where(c => missingItems.Select(mi => mi.claimId).Distinct().Contains(c.id)).ToList()

可以使用“联接”在一行中执行此操作:

class MissingItems
{
    public string Id {get;set;}
}
class Claims
{
    public string ClaimId {get;set;}
}

void Main()
{
    List<MissingItems> mi = new List<MissingItems>() {
        new MissingItems() {Id = "a"},
        new MissingItems() {Id = "b"},
        new MissingItems() {Id = "c"},
        new MissingItems() {Id = "d"},
    };
    List<Claims> cl = new List<Claims>() {
        new Claims() {ClaimId = "a"},
        new Claims() {ClaimId = "f"},
        new Claims() {ClaimId = "c"},
        new Claims() {ClaimId = "d"},
    };

    var a = mi.Join(cl, m => m.Id, c => c.ClaimId, (m,c) => {       
        return new { Claim = c.ClaimId, Missing = m.Id};
    });
    foreach(var b in a) 
    {
        Console.WriteLine("Claim: " + b.Claim + " Missing: " + b.Missing);
    }
}

可以使用“联接”在一行中执行此操作:

class MissingItems
{
    public string Id {get;set;}
}
class Claims
{
    public string ClaimId {get;set;}
}

void Main()
{
    List<MissingItems> mi = new List<MissingItems>() {
        new MissingItems() {Id = "a"},
        new MissingItems() {Id = "b"},
        new MissingItems() {Id = "c"},
        new MissingItems() {Id = "d"},
    };
    List<Claims> cl = new List<Claims>() {
        new Claims() {ClaimId = "a"},
        new Claims() {ClaimId = "f"},
        new Claims() {ClaimId = "c"},
        new Claims() {ClaimId = "d"},
    };

    var a = mi.Join(cl, m => m.Id, c => c.ClaimId, (m,c) => {       
        return new { Claim = c.ClaimId, Missing = m.Id};
    });
    foreach(var b in a) 
    {
        Console.WriteLine("Claim: " + b.Claim + " Missing: " + b.Missing);
    }
}

所以我还是要分开做。使用lamda有好处吗?不知道你的意思是什么。还有其他LINQ/lambda方法可以解决您的问题。lambda的主要好处是,您不必在C中编写大量SQL字符串/调用存储过程。相反,您可以使用常规的收集方法。当您已经在C代码库中时,通常更可读/更方便。非常感谢。当我单独说的时候,我的意思是写两个单独的语句:首先获取ID列表,然后使用列表检索声明列表。我认为有一种方法可以用一句话来表达。但我现在明白了。谢谢。@user1828605编辑它时使用的lambda与您编写的SQL几乎完全相同,如果这就是您所说的一条语句的意思的话。是的。我现在明白了,我同意你的看法。第一个答案更具可读性。我不太喜欢lambda,所以它仍然让人困惑。我通常在我的C应用程序中编写SQL语句。我想摆脱这种状况,开始使用lambda。谢谢你给我看这个。这很有帮助,所以我还是要分开做。使用lamda有好处吗?不知道你的意思是什么。还有其他LINQ/lambda方法可以解决您的问题。lambda的主要好处是,您不必在C中编写大量SQL字符串/调用存储过程。相反,您可以使用常规的收集方法。当您已经在C代码库中时,通常更可读/更方便。非常感谢。当我单独说的时候,我的意思是写两个单独的语句:首先获取ID列表,然后使用列表检索声明列表。我认为有一种方法可以用一句话来表达。但我现在明白了。谢谢。@user1828605编辑它时使用的lambda与您编写的SQL几乎完全相同,如果这就是您所说的一条语句的意思的话。是的。我现在明白了,我同意你的看法。第一个答案更具可读性。我不太喜欢lambda,所以它仍然让人困惑。我通常在我的C应用程序中编写SQL语句。我想摆脱这种状况,开始使用lambda。谢谢你给我看这个。这很有帮助,为什么会被否决?问简单的问题是错误的吗?我没有投反对票,但可能是因为你没有表现出你的努力。可能是因为你要求转换而没有表现出你的努力。为什么投反对票?问简单的问题是错误的吗?我没有投反对票,但可能是因为你没有表现出你的努力,也就是说。可能是因为你没有表现出你的努力就要求转换。