C# 使用LINQ或EF执行查询以从多个表中获取记录

C# 使用LINQ或EF执行查询以从多个表中获取记录,c#,asp.net-mvc,entity-framework,linq,C#,Asp.net Mvc,Entity Framework,Linq,我已经找了一段时间了。但所有的解决方案似乎都不同于我的预期 这是我在SQL中的查询:- Select * from ( select Name,Description Descr from CourseTbl union all select MainDesc Name,MainDesc Descr from CoursedescTbl union all select SubHeading Name,SubDesc Descr from CourseSu

我已经找了一段时间了。但所有的解决方案似乎都不同于我的预期

这是我在SQL中的查询:-

Select * from
(
    select Name,Description Descr from CourseTbl
    union all
    select MainDesc Name,MainDesc Descr from CoursedescTbl
    union all
    select SubHeading Name,SubDesc Descr from CourseSubDesc
    union all
    select Name,Descr as Descr from InternTbl
)A where A.Name like '%D%' or A.Descr like '%D%'
我想使用LINQ或EF执行上述查询。并以Json格式返回列表。所以我尝试了很多失败的尝试,这是其中之一:-

public JsonResult SearchDetail()
    {
        string SearchKey = Request.Form["SearchName"].ToString();

        IEnumerable<SearchList> QueryResult;

        using (EBContext db = new EBContext())
        {
            try
            {
                QueryResult = 
                    (from x in db.Courses 
                     select new { A = x.Name, B = x.Description })
                    .Concat(from y in db.CourseDesc 
                            select new { A = y.MainHeading, B = y.MainDesc })
                    .Concat(from z in db.CourseSubDesc 
                            select new { A = z.SubDesc, B = z.SubHeading })
                    .Concat(from w in db.Interns 
                            select new { A = w.Name, B = w.Descr })
                    .ToList();                    
            }
            catch (Exception ex)
            {
                return new JsonResult 
                {
                    Data = ex.Message, 
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet 
                };
            }



            return new JsonResult 
            { 
                Data = QueryResult, 
                JsonRequestBehavior = JsonRequestBehavior.AllowGet 
            };
        }

    }
我无法将where子句放在linq查询中,该查询将在所有表中搜索。 将queryresult分配给ef查询时出错。它说不能投到无数。
提前谢谢。

您能解释一下您所遇到的错误吗

另外,您是否尝试过在linq中使用

QueryResult = db.Courses.Select(x=> new { A = x.Name, B= x.Description})
             .Union(db.CourseDesc.Select(y=> new {A = y.MainHeading, B = y.MainDesc })
             .Union( //so on 
             .ToList(); //this isn't necessary 
编辑:有两种方法可以输入where子句,可以在每次搜索时输入,也可以在末尾输入:

 QueryResult = db.Courses.Where(x=>x.Name == "Name").Select(x=> new { A = x.Name, B= x.Description})
             .Union(db.CourseDesc.Where(y=>y.MainHeading == "Name").Select(y=> new {A = y.MainHeading, B = y.MainDesc })
             .Union( //so on 
             .ToList(); 
或:


您没有说明您将遇到什么错误/异常。但是您的QueryResult是IEnumerable类型,并且您似乎正在为其分配匿名类型{A,B}的可枚举项

试试这个:

QueryResult = (from x in db.Courses 
                 select new SearchList { Name = x.Name, Descr = x.Description })
                 .Concat(...)
                 .ToList();

更新

如果您像我上面所做的那样将选择更改为新建搜索列表,而不是新建匿名类型,那么您的2个问题将得到解决

对于第1期,您应该在选择之前插入Where:


在每个表上执行Where作为查询的一部分很重要,这样您就不会从该表中获取所有记录,而不像在Concat之后执行Where。还请注意,可能会引发ArgumentNullException。

分别获取列表,然后查询和concat 检查这个例子

        List<string> a = new List<string>() { "a", "b", "c" };
        List<string> b = new List<string>() { "ab", "bb", "cb" };

        IEnumerable<SearchList> QueryResult = 
            a.Where(x => x.Contains("a")).Select(x => new SearchList() { Name = x, Descr = x })
            .Concat(b.Where(x => x.Contains("a")).Select(x => new SearchList() { Name = x, Descr = x }));

谢谢你抽出时间。请看我编辑的问题。谢谢,如果你能复制粘贴错误,那会有很大帮助。我仍然不确定代码的哪一部分给出了错误,可能是使用了匿名类型。我将很快编辑我的答案以设置Where子句。谢谢,我会检查并让您知道。我可以问一下Negative mark的原因吗?谢谢,我会检查并让您知道。谢谢您的努力,但我的代码中似乎有很多编辑。有没有其他方法可以像在我的代码中使用直接sql查询一样记住sql注入?@Deepak,即使您在代码中编写sql语句,您仍然需要编写同样多的查询——每个表一个查询。
QueryResult = (from x in db.Courses 
                 select new SearchList { Name = x.Name, Descr = x.Description })
                 .Concat(...)
                 .ToList();
QueryResult = db.Courses.Select(x => new SearchList 
                 { Name = x.Name, Descr = x.Description})
                .Concat(...)
                .ToList();
result1 = db.Courses
                .Where(x => x.Name.Contains('D') || x.Description.Contains('D'))
                .Select(x => new SearchList { Name = x.Name, Descr = x.Description});
result2 = db.CourseDesc
                .Where(y => y.MainHeading.Contains('D') || y.MainDesc.Contains('D'))
                .Select(y => new SearchList { Name = y.MainHeading, Descr = y.MainDesc});
result3 = db.CourseSubDesc
                .Where(...)
                .Select(...);

QueryResult = result1.Concat(result2).Concat(result3).ToList();
        List<string> a = new List<string>() { "a", "b", "c" };
        List<string> b = new List<string>() { "ab", "bb", "cb" };

        IEnumerable<SearchList> QueryResult = 
            a.Where(x => x.Contains("a")).Select(x => new SearchList() { Name = x, Descr = x })
            .Concat(b.Where(x => x.Contains("a")).Select(x => new SearchList() { Name = x, Descr = x }));