C# 在LINQ语句中执行多个联接

C# 在LINQ语句中执行多个联接,c#,.net,linq,asp.net-mvc-3,entity-framework,C#,.net,Linq,Asp.net Mvc 3,Entity Framework,有人能帮我把下面的SQL查询翻译成LINQ格式吗 SELECT a.ID, a.HostID, h.URL, a.SourceURL, a.TargetURL, c.Value, a.ExtFlag FROM Link a INNER JOIN Host h ON h.ID = a.HostID INNER JOIN Ref c ON a.ResponseCode = c.SubType AND c.Type =

有人能帮我把下面的SQL查询翻译成LINQ格式吗

SELECT a.ID,
       a.HostID,
       h.URL,
       a.SourceURL,
       a.TargetURL,
       c.Value,
       a.ExtFlag
FROM Link a
INNER JOIN Host h
ON h.ID = a.HostID
INNER JOIN Ref c
ON a.ResponseCode = c.SubType
AND c.Type = 'HTTP Status'

非常感谢

我想应该是这样的:

var result = from a in Context.DGApprovedLink 
             join h in Context.DGHost on a.HostID equals h.ID
             join c in Context.DGConfig on a.ResponseCode equals c.SubType
             where c.Type == "HTTP Status"
             select new {
                 a.ID,
                 a.HostID,
                 h.URL,
                 a.SourceURL,
                 a.TargetURL,
                 c.Value,
                 a.ExtFlag };
使用MStest创建单元测试类并复制代码
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用Microsoft.VisualStudio.TestTools.UnitTesting;
名称空间LinqTest.Test
{
公营雇员
{
公共int EmpId{get;set;}
公共字符串名称{get;set;}
公共日期时间?DOB{get;set;}
公共十进制工资{get;set;}
公共日期时间DOJ{get;set;}
公共bool IsActive{get;set;}
}
公共课堂用书
{
public int BookId{get;set;}
公共字符串标题{get;set;}
公共双价{get;set;}
}
公共类图书订单
{
公共int-OrderId{get;set;}
公共int EmpId{get;set;}
public int BookId{get;set;}
公共整数数量{get;set;}
}
[测试类]
公共类Linqtest
{
列出员工名单;
列出书籍;
列出订单;
[测试初始化]
公共无效初始化数据()
{
雇员=新名单();
书籍=新列表();
订单=新列表();
Add(new Employee(){EmpId=1,Name=“Test1”,DOB=new DateTime(1980,12,15),IsActive=true,Salary=4500});
Add(newemployee(){EmpId=11,Name=“Test2”,DOB=newdatetime(1981,12,15),IsActive=true,Salary=3500});
Add(new Employee(){EmpId=5,Name=“Test3”,DOB=new DateTime(1970,2,15),IsActive=true,Salary=5500});
Add(newemployee(){EmpId=8,Name=“Test4”,DOB=newdatetime(1978,1,15),IsActive=true,Salary=7500});
Add(new Employee(){EmpId=9,Name=“Test5”,DOB=new DateTime(1972,2,5),IsActive=true,Salary=2500});
Add(new Employee(){EmpId=10,Name=“Test6”,DOB=new DateTime(1980,10,8),IsActive=false,Salary=5500});
Add(newemployee(){EmpId=15,Name=“Test7”,DOB=newdatetime(1983,11,25),IsActive=true,Salary=3500});
Books.Add(newbook(){BookId=2,Price=24.99,Title=“British Food”});
Books.Add(newbook(){BookId=5,Price=4.99,Title=“Holidays in UK”});
Books.Add(newbook(){BookId=7,Price=7.99,Title=“UK Laws”});
Add(newbookorder(){EmpId=1,OrderId=1,BookId=2,Quantity=3});
Add(newbookorder(){EmpId=1,OrderId=1,BookId=5,Quantity=1});
Add(newbookorder(){EmpId=1,OrderId=2,BookId=7,Quantity=5});
Add(newbookorder(){EmpId=11,OrderId=3,BookId=2,Quantity=3});
Add(newbookorder(){EmpId=11,OrderId=4,BookId=7,Quantity=3});
}
[测试方法]
public void CheckEmpCount()
{
var res=员工
.其中(e=>e.EmpId>5)
其中(t=>t.Salary>=5000);
aresequal(2,res.Count());
res=员工
其中(e=>e.EmpId>5);
aresequal(5,res.Count());
}
[测试方法]
public void TestGroupBy()
{
var res=员工中的e
e组按e.工资;
aresequal(5,res.Count());
var res1=Employees.GroupBy(e=>e.Salary);
aresequal(5,res1.Count());
}
[测试方法]
公共void TestJoin()
{
var res=从订单中的o开始
在员工中加入员工e
关于o.EmpId等于e.EmpId
其中o.EmpId==11
选择o;
aresequal(2,res.Count());
}
[测试方法]
公共void TestJoinData()
{
var res=从订单中的o开始
在员工中加入员工e
关于o.EmpId等于e.EmpId
在书中加入书b
关于o.BookId等于b.BookId
orderby e.EmpId
选择新的{o.OrderId,e.Name,b.Title,b.Price};
AreEqual(“Test1”,res.First().Name);
}
}
}

非常感谢。我试过了,但在第三次连接时出现了一个错误,错误是“join子句中的一个表达式的类型不正确。在调用“join”时类型推断失败。”正在工作。必须使用ToString函数进行一次比较。谢谢,事实上。它不起作用了。将int值与字符串值进行比较时出错。使用以下方法:SqlFunctions.StringConvert((double)a.ResponseCode)等于c.subscription真的吗?!你期望它如何“正确”比较不同类型的值?!您从未指定过类型,那么我们如何知道它们?在LINQ方面,查询应该可以很好地工作,juts可以适当地处理您的类型。我在第三个join中遇到一个错误,一个红色的曲线表示其中一个表达式的类型…“非常类似于第一个注释中的相同”join子句中的一个表达式的类型不正确。调用“Join”时类型推断失败。:SWell,DGApprovedLinks.ResponseCode和DGConfigs.SubType的类型是什么?ResponseCode为int,SubType为string。刚刚执行了ToString,错误不再显示。谢谢事实上它不起作用了。将int值与字符串值进行比较时出错。使用以下方法:SqlFunctions.StringConvert((double)a.ResponseCode)等于c.Subsubject如果不解释这一切的作用以及它与提问者想知道的内容的关系,这是一个非常糟糕的答案。
Create Unit test class using MStest and copy the code 

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace LinqTest.Test
{

    public class Employee
    {
        public int EmpId { get; set; }
        public string Name { get; set; }
        public DateTime? DOB { get; set; }
        public decimal Salary { get; set; }
        public DateTime DOJ { get; set; }
        public bool IsActive { get; set; }
    }


    public class Book
    {
        public int BookId { get; set; }
        public string Title { get; set; }
        public double Price { get; set; }
    }

    public class BookOrder
    {
        public int OrderId { get; set; }
        public int EmpId { get; set; }
        public int BookId { get; set; }
        public int Quantity { get; set; }
    }



    [TestClass]
    public class Linqtest
    {
        List<Employee> Employees;
        List<Book> Books;
        List<BookOrder> Orders;

        [TestInitialize]
        public void InitializeData()
        {
            Employees = new List<Employee>();
            Books = new List<Book>();
            Orders = new List<BookOrder>();

            Employees.Add(new Employee(){EmpId = 1, Name ="Test1" ,  DOB = new DateTime(1980,12,15),IsActive = true,Salary = 4500});
            Employees.Add(new Employee() { EmpId = 11, Name = "Test2", DOB = new DateTime(1981, 12, 15), IsActive = true, Salary = 3500 });
            Employees.Add(new Employee() { EmpId = 5, Name = "Test3", DOB = new DateTime(1970, 2, 15), IsActive = true, Salary = 5500 });
            Employees.Add(new Employee() { EmpId = 8, Name = "Test4", DOB = new DateTime(1978, 1, 15), IsActive = true, Salary = 7500 });
            Employees.Add(new Employee() { EmpId = 9, Name = "Test5", DOB = new DateTime(1972, 2, 5), IsActive = true, Salary = 2500 });
            Employees.Add(new Employee() { EmpId = 10, Name = "Test6", DOB = new DateTime(1980, 10, 8), IsActive = false, Salary = 5500 });
            Employees.Add(new Employee() { EmpId = 15, Name = "Test7", DOB = new DateTime(1983, 11, 25), IsActive = true, Salary = 3500 });

            Books.Add(new Book(){BookId = 2, Price = 24.99,Title = "British Food"});
            Books.Add(new Book() { BookId = 5, Price = 4.99, Title = "Holidays in UK" });
            Books.Add(new Book() { BookId = 7, Price = 7.99, Title = "UK Laws" });


            Orders.Add(new BookOrder(){EmpId = 1,OrderId = 1,BookId = 2,Quantity = 3});
            Orders.Add(new BookOrder() { EmpId = 1, OrderId = 1, BookId = 5, Quantity = 1 });
            Orders.Add(new BookOrder() { EmpId = 1, OrderId = 2, BookId = 7, Quantity = 5 });
            Orders.Add(new BookOrder() { EmpId = 11, OrderId = 3, BookId = 2, Quantity = 3 });
            Orders.Add(new BookOrder() { EmpId = 11, OrderId = 4, BookId = 7, Quantity = 3 });
        }


        [TestMethod]
        public void CheckEmpCount()
        {

            var res = Employees
                .Where(e => e.EmpId > 5)
                .Where(t =>t.Salary>=5000);

            Assert.AreEqual(2,res.Count());

            res = Employees
                .Where(e => e.EmpId > 5);

            Assert.AreEqual(5,res.Count());

        }

        [TestMethod]
        public void TestGroupBy()
        {
            var res = from e in Employees
                group e by e.Salary;

            Assert.AreEqual(5,res.Count());

            var res1 = Employees.GroupBy(e => e.Salary);
            Assert.AreEqual(5, res1.Count());
        }

        [TestMethod]
        public void TestJoin()
        {
            var res = from o in Orders
                join Employee e in Employees
                    on o.EmpId equals e.EmpId
                where o.EmpId == 11
                select o;

            Assert.AreEqual(2,res.Count());
        }

        [TestMethod]
        public void TestJoinData()
        {
            var res = from o in Orders
                join Employee e in Employees
                    on o.EmpId equals e.EmpId 
                join Book b in Books
                    on o.BookId equals b.BookId 
                orderby e.EmpId
                select new {o.OrderId, e.Name, b.Title, b.Price};

            Assert.AreEqual("Test1", res.First().Name);

        }

    }
}